Java 使用位
首先我要说的是,我以前从未在编程中真正使用过比特。我有一个可以处于3种状态的对象,我想使用3位数组来表示这些状态。
例如:
我有一辆赛车,它可以向前,向左和向右静止,如果汽车向前移动,则位将为010
,如果向前和向左,则位将为110,依此类推......
如何设置位,以及如何读回它们以获取值?
首先我要说的是,我以前从未在编程中真正使用过比特。我有一个可以处于3种状态的对象,我想使用3位数组来表示这些状态。
例如:
我有一辆赛车,它可以向前,向左和向右静止,如果汽车向前移动,则位将为010
,如果向前和向左,则位将为110,依此类推......
如何设置位,以及如何读回它们以获取值?
我建议使用BitSet和enum的
enum State { LEFT, RIGHT, FORWARD,STAND_STILL}
BitSet stat=new BitSet(4);
void setLeft() // and so on for each state
{
stat.set(State.LEFT);
}
boolean isLeft()
{
stat.get(State.LEFT);
}
void reset() //reset function to reset the state
{
stat.clear();
}
如果大小和速度很重要,请在字节中使用位。(阅读其他答案中发布的链接,因为在使用和转换签名数据类型时存在不明显的复杂情况。
这编码速度:站立,左,left_forward,前进,right_forward和右。
public class Moo {
final static byte FORWARD = 0x1; // 00000001
final static byte LEFT =0x2; // 00000010
final static byte RIGHT =0x4; // 00000100
/**
* @param args
*/
public static void main(String[] args) {
byte direction1 = FORWARD|LEFT; // 00000011
byte direction2 = FORWARD|RIGHT; // 00000101
byte direction3 = FORWARD|RIGHT|LEFT; // 00000111
byte direction4 = 0;
// someting happens:
direction4 |= FORWARD;
// someting happens again.
direction4 |= LEFT;
System.out.printf("%x: %s\n", direction1, dirString(direction1));
System.out.printf("%x: %s\n", direction2, dirString(direction2));
System.out.printf("%x: %s\n", direction3, dirString(direction3));
System.out.printf("%x: %s\n", direction4, dirString(direction4));
}
public static String dirString( byte direction) {
StringBuilder b = new StringBuilder("Going ");
if( (direction & FORWARD) > 0){
b.append("forward ");
}
if( (direction & RIGHT) > 0){
b.append("turning right ");
}
if( (direction & LEFT) > 0){
b.append("turning left ");
}
if( (direction &( LEFT|RIGHT)) == (LEFT|RIGHT)){
b.append(" (conflicting)");
}
return b.toString();
}
}
输出:
3: Going forward turning left
5: Going forward turning right
7: Going forward turning right turning left (conflicting)
3: Going forward turning left
还要注意,左和右是互斥的,因此可能会创建非法组合。(7 = 111 )
如果你真的意味着一个东西只能向左,向前或向右移动,那么你不需要标志,只需要枚举。
此枚举只能以两位传输。
enum Direction{
NONE, FORWARD, RIGHT, LEFT;
}
Direction dir = Direction.FORWARD;
byte enc = (byte) dir.ordinal();
中的最后两位将变为:enc
00 : none
01 : forward;
10 : right
11 : left