Java使用位

时间:2010-10-27 10:40:46

标签: java bits bitmask

首先让我说在编程之前我从未真正使用过bit。我有一个可以处于3种状态的对象,我希望使用3位数组来表示这些状态。
例如:

我有一辆赛车,它可以向前,向左和向右前进,但是比特将是000 如果汽车向前移动,如果向前,那么位将是010,并且它将是110等...

我如何设置这些位,如何读取它们以获取值?

5 个答案:

答案 0 :(得分:10)

我建议使用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();
}

答案 1 :(得分:9)

如果大小和速度很重要,请使用一个字节中的位。 (阅读其他答案中发布的链接,因为在使用和转换签名数据类型时存在非明显的复杂情况。)

这对速度进行编码:stand,left,left_forward,forward,right_forward和right。

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 

另请注意,Left和Right是互斥的,因此可能会创建非法组合。 (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

答案 2 :(得分:4)

至少需要存储这三位是byte

在按位运算符上阅读this tutorial以开始使用。

编辑:位掩码上的this page也可能非常有用。

答案 3 :(得分:3)

你说三个州,但你实际上有六个:前锋,左前锋,右前锋,左,右,静止。除非你的赛车没有横向移动,否则你有四个。

你应该真的使用enum

enum State { FORWARD, FORWARD_LEFT, FORWARD_RIGHT, STAND_STILL }

由于左,右和前进是相互排斥的,所以这不适合一个小小的程序。你会遇到各种一致性问题。

答案 4 :(得分:2)

在java.util中有一个名为BitSet的类,它使位操作变得非常简单。

在您的情况下,您可以创建一个大小为3的BitSet,然后使用get()和set()方法来设置检查位。