题
让我说我从来没有与位编程果然奏效之前启动。我有一个对象,该对象可以是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();
}
您说的三种状态,但实际上你已经拿到了6:向前,向前,左,前右,左,右,停转。除非你的赛车不动侧身ofcourse,那么你已经有四个。
您真的应该使用枚举此:
enum State { FORWARD, FORWARD_LEFT, FORWARD_RIGHT, STAND_STILL }
由于左,右和前是互斥的,这不是一个很好的适合的位摆弄程序。你会惹上各种各样的一致性问题。
在java.util中有一类称为位集合使位操作非常简单。
在你的情况,你可以创建一个位集合大小为3,然后使用get()和set()方法设置校验位。
不隶属于 StackOverflow