まず、プログラミングでビットを実際に扱ったことは一度もありません。3 つの状態になるオブジェクトがあり、3 ビット配列を使用してそれらの状態を表現したいと考えています。
例:
私はレースカーを持っていて、静止状態で前進、左、右に移動できます。ビットは 000 になります
。車が前進している場合、ビットは 010 になります。前進し、左に移動している場合、ビットは 110 になります。
ビットをどのように設定し、値を取得するためにそれらを読み戻すにはどうすればよいですか?
5 に答える
I would suggest using BitSet along with enum's
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();
}
サイズと速度が重要な場合は、バイト内のビットを使用してください。(署名されたデータ型を使用およびキャストするときに明らかではない複雑さがあるため、他の回答に投稿されたリンクをお読みください。)
これは、速度をエンコードします: 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 )
物が LEFT、FORWARD、または RIGHT にのみ移動できることを実際に意味している場合は、フラグは必要なく、列挙型だけが必要です。
この列挙型は、2 ビットのみで転送できます。
enum Direction{
NONE, FORWARD, RIGHT, LEFT;
}
Direction dir = Direction.FORWARD;
byte enc = (byte) dir.ordinal();
の最後の 2 ビットは次のenc
ようになります。
00 : none
01 : forward;
10 : right
11 : left
あなたは3つの状態を言いますが、実際には6つあります。前方、前方左、前方右、左、右、静止です。もちろん、レースカーが横に動かない限り、4台あります。
これには実際に列挙型を使用する必要があります。
enum State { FORWARD, FORWARD_LEFT, FORWARD_RIGHT, STAND_STILL }
左、右、および前方は相互に排他的であるため、これは少しいじくり回すプログラムにはあまり適していません。あらゆる種類の一貫性の問題が発生します。
java.util には、ビット操作を非常に簡単にするBitSetというクラスがあります。
あなたの場合、サイズ 3 の BitSet を作成し、get() および set() メソッドを使用してビットのチェックを設定できます。