Frage

Lassen Sie mich zunächst sagen, ich habe nie wirklich mit Bits gearbeitet, bevor in der Programmierung. Ich habe ein Objekt, das in 3 Zuständen sein kann, und ich will diese Zustände unter Verwendung eines 3-Bit-Array darstellen.
Zum Beispiel:
Ich habe ein Auto-Rennen und es kann weitergehen, links und rechts an einem Stand noch würden die Bits 000
sein Wenn das Auto bewegte sich nach vorn würden die Bits 010, wenn nach vorne und es verlassen würde 110 usw. sein ...
Wie würden stelle ich die Bits und wie kann ich sie lesen zurück, um die Werte zu erhalten?

War es hilfreich?

Lösung

Wenn Größe und Geschwindigkeit wichtig ist, verwendet Bits in einem Byte. (Lesen gepostet die Links in der anderen Antwort, da es nicht offensichtlich Komplikationen bei der Verwendung und unterzeichneten Datentypen Gießen).

Dieses codiert für die Geschwindigkeiten. Stand, links, left_forward, vorwärts, right_forward und rechts

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

}

Ausgabe:

3: Going forward turning left 
5: Going forward turning right 
7: Going forward turning right turning left  (conflicting)
3: Going forward turning left 

Beachten Sie auch, dass links und rechts sich gegenseitig aus, so dass ihr möglich, eine illegale Kombination zu schaffen. (7 = 111)

Wenn Sie tatsächlich dazu geführt, dass ein Ding kann nur links, vorne oder rechts bewegen, dann brauchen Sie nicht, Fahnen, nur Aufzählungen.

In dieser Enum ist möglich Transport in nur zwei Bits.

    enum Direction{
    NONE, FORWARD, RIGHT, LEFT;

}


Direction dir = Direction.FORWARD;
byte enc = (byte) dir.ordinal();

Die letzten beiden Bits in enc werden werden:

00 : none  
01 : forward;
10 : right
11 : left

Andere Tipps

würde ich mit BitSet vorschlägt zusammen mit Enum des

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

Die am wenigsten Sie diese drei Bits speichern müssen, ist ein byte.

dieses Tutorial auf Bitoperatoren, um loszulegen.

Edit:. diese Seite auf Bitmasken auch sehr hilfreich sein kann

Sie sagen drei Staaten, aber Sie haben tatsächlich sechs: vorwärts, vorwärts-links, vorne rechts, links, rechts, Stand-still. Es sei denn, Ihr Rennwagen seitwärts bewegt sich nicht OFCOURSE, dann musst du vier.

Sie sollten wirklich ein Enum für diese verwenden:

enum State { FORWARD, FORWARD_LEFT, FORWARD_RIGHT, STAND_STILL }

Da links, rechts und nach vorn gegenseitig ausschließen, ist dies nicht eine sehr gute Passform für ein bisschen-Hantieren Programm. Sie werden in allen Arten von Konsistenzprobleme bekommen.

In java.util gibt es eine Klasse namens BitSet das macht Bitmanipulations sehr einfach.

In Ihrem Fall, dass Sie eine BitSet der Größe 3 schaffen könnten und dann das get () und set () Methoden, um einen Scheck zu setzen, die Bits.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top