让我说我从来没有与位编程果然奏效之前启动。我有一个对象,该对象可以是3个状态,我想使用3比特数组来表示那些状态。点击 例如:搜索结果 我有一个赛车,它可以前进,左,右在静止不动的位将是000搜索 如果车子向前走位将是010,如果前进,离开这将是110等... 搜索结果 我将如何设置位,我怎么能读他们回去取值是多少?

有帮助吗?

解决方案

如果大小和速度是重要的,使用位在一个字节。 (阅读链接张贴在因为有使用和铸造签数据类型时,非明显并发症对方的回答。)

此编码速度:支架,左,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

其他提示

我会建议使用的BitSet随着枚举的

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();
}

你需要存储这三个位至少是一个byte

本教程对位操作上手。

编辑:对位掩码此页面也可能是非常有帮助的。

您说的三种状态,但实际上你已经拿到了6:向前,向前,左,前右,左,右,停转。除非你的赛车不动侧身ofcourse,那么你已经有四个。

您真的应该使用枚举此:

enum State { FORWARD, FORWARD_LEFT, FORWARD_RIGHT, STAND_STILL }

由于左,右和前是互斥的,这不是一个很好的适合的位摆弄程序。你会惹上各种各样的一致性问题。

在java.util中有一类称为位集合使位操作非常简单。

在你的情况,你可以创建一个位集合大小为3,然后使用get()和set()方法设置校验位。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top