質問
私は本当にプログラミングの前にビットで働いたことはないと言ってみましょう。私は3つの状態にあることができるオブジェクトを持っていると私は、3ビットの配列を使用して、それらの状態を表現したいです。
たとえば、次のように
私は、レースカーを持っており、それは前に進むことができ、左、右のスタンドではまだビットは000
だろう
車が前進していた場合、前方、それは110などになり放置すればビットは010になります...
どのように私はビットを設定しますとどのように私は値を取得するために戻ってそれらを読むことができますか?
解決
、バイト内のビットを使用します。 (非自明な合併症があるとして署名データ型を使用すると、鋳造時に読むのリンクは、他の回答に掲載。)
速度のために、このエンコード:スタンド、左、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)
あなたが実際に事が唯一のLEFT、FORWARDまたはRIGHTを動かすことができることを意味している場合、、そしてあなただけの列挙、フラグを必要としません。
この列挙は、2ビットのみで搬送することが可能である。
enum Direction{
NONE, FORWARD, RIGHT, LEFT;
}
Direction dir = Direction.FORWARD;
byte enc = (byte) dir.ordinal();
enc
の最後の2ビットとなるであろう:
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の、あなたは4を持っていない場合を除きます。
あなたは本当にこのために列挙するを使用する必要があります
enum State { FORWARD, FORWARD_LEFT, FORWARD_RIGHT, STAND_STILL }
左以来、右前方相互に排他的である、これは、ビットいじるプログラムのために非常に良いフィットではありません。あなたは、一貫性の問題のすべての種類に取得します。
java.utilのたBitSetと呼ばれるクラスがありますのことは、ビット操作は非常に簡単になります。
あなたのケースでは、あなたがサイズ3のたBitSetを作成し、GETを(使用することができます)と、チェックビットを設定するためのセット()メソッドます。