2010-12-28 4 views
22

Ich habe die folgen:bitmask Frage?

public static final int LIMIT_ONE = 1; 
public static final int TRADEABLE = (1 << 1); 
public static final int SELLABLE = (1 << 2); 
public static final int STORABLE = (1 << 3); 
public static final int STORABLE_IN_WH = (1 << 4); 
public static final int STORABLE_IN_LEGION_WH = (1 << 5); 
public static final int BREAKABLE = (1 << 6); 
public static final int SOUL_BOUND = (1 << 7); 
public static final int UNK9 = (1 << 8); 
public static final int UNK10 = (1 << 9); 
public static final int UNK11 = (1 << 10); 
public static final int CAN_COMPOSITE_WEAPON = (1 << 11); 
public static final int BLACK_CLOUD_TRADERS = (1 << 12); 
public static final int CAN_SPLIT = (1 << 13); 
public static final int UNK15 = (1 << 14); 
public static final int UNK16 = (1 << 15); 

und ich wollte verstehen, wie es die Folge Ergebnis gibt berechnet wird, zum Beispiel:

Ich bin wirklich ratlos, wie die bitmask Arbeit und wenn Jeder könnte vielleicht ein paar Tipps geben und erklären, wie es zu dieser Nummer geht, die ich sehr schätzen würde.

+0

Möchten Sie wissen, was '' '' tut? Ich verstehe die Frage nicht. –

+0

@Nikita aus dem obigen Satz Ich wollte verstehen, wie es die 12414 Bitmaske erzeugt und wie man es zurückstellt. – Prix

Antwort

20

Der Ausdruck (1 << n) wird auf 2 entspricht der Leistung von n erhöht.

Wenn Sie (1 << n) | (1 << m) schreiben dies ist das gleiche wie (1 << n) + (1 << m) solange n und m unterschiedlich sind. So können Sie es in Bezug auf einfache Ergänzungen vorstellen, wenn Sie es wünschen.

Die Anzahl 12414 in binär ist 11000001111110 so ist es die Summe (oder bitweise OR) der folgenden Flags:

 
TRADEABLE    1 << 1 =  2 
SELLABLE     1 << 2 =  4 
STORABLE     1 << 3 =  8 
STORABLE_IN_WH   1 << 4 = 16 
STORABLE_IN_LEGION_WH 1 << 5 = 32 
BREAKABLE    1 << 6 = 64 
BLACK_CLOUD_TRADERS  1 << 12 = 4096 
CAN_SPLIT    1 << 13 = 8192 
======================================== 
         Total = 12414 

zu beachten, dass die Kennzeichen, die enthalten sind, die den Bits entsprechen, die in dem binären eingestellt sind Darstellung von 12414, wenn von rechts nach links gelesen wird.

+1

Korrekt, aber vielleicht hat er gefragt, wie man in einer bestimmten Nummer (z. B. 12414) welche Flags gespeichert werden - er sucht nach dem '&' operator imho. – Konerak

+0

Also (1 << 1) würde in 2 resultieren? und (1 << n) + (1 << m) würde zu 14 führen, wo n = 3 und m = 4? – Prix

+0

@Konerak Ja ich wollte wissen, wie man es von dieser Nummer zurücksetzt. – Prix

0

Ich verstehe die Frage nicht „wie sie berechnet wird, um die Folge Ergebnis zu geben“. (Was berechnet?)

Die wichtigste Sache zu verstehen ist, dass alle Computer-Werte in binär gespeichert sind. Jede Zahl ist eine Kombination aus 0 und 1 Bit. Einige Zahlen haben nur ein 1 Bit.

http://en.wikipedia.org/wiki/Mask_(computing)

5

a << b verschiebt die Bits in ab Werte nach links, um die neuen Bits auf der rechten Seite mit Nullen Polsterung. 1 << n entspricht eine ganze Zahl mit nur den n th Bit-Satz (von 0 von rechts gezählt), was 2 n entspricht.

12414 ist 11000001111110 in binär. Daher wird es durch Summieren der unten aufgelisteten Konstanten erzeugt. Sie können dies herausfinden, indem Sie sehen, dass das Bit 1 von rechts gesetzt ist, daher TRADEABLE ist "set"; Bit 7 ist nicht gesetzt (es ist 0), daher ist SOUL_BOUND nicht "gesetzt". Beachten Sie, wie sich die Bitnummern den angegebenen Werten von (1 << n) zuordnen.

+0

++ Du bist schnell! Beat mich dazu. –

0

Meine Vermutung wäre, dass Sie eine Nummer nehmen, wie Ihr Beispiel 12414, und herausfinden, welche Eigenschaften darin enthalten sind.

Zum Beispiel, da 12414 11000001111110 binär ist, was auch immer es angehängt ist, ist handelbar, weil AND diese Zahl mit der Maske Ihnen eine 1 im zweiten Bit geben wird.

0

In binär, 12414 ist 11000001111110. LIMIT_ONE in binär ist 1 und < <, das ist der bitshift-Operator verschiebt die Null nach links Padding mit einer Null auf der rechten Seite. Daher ist handelbaren in binären 10 und so weiter, bis unk16, die bis endet als 1000000000000000. nun diese Werte zusammen bitweise unter Verwendung von OR, die im Grunde ein 1 an jeder Position bringt, wobei mindestens einer seiner Operanden an dieser Position ein EINS hat (In den meisten Sprachen wird der Pipe-Operator '|' verwendet).

Beispiel:

100 | 10 = 110 

Deshalb, um 12414 zu erhalten, müssen Sie eine bitweise OR auf die folgenden Variablen tun: unk16, unk15, handelbare, selleable, speicherbar, speicherbar in wh, speicherbar in Legion wh und zerbrechlich. Die Kombination von Einsen an den verschiedenen Positionen in jeder dieser Variablen ergibt die binäre Zahl 11000001111110, die 12414 als Dezimalzahl ergibt.

Dies ist wahrscheinlich der einfachste Weg, es zu erklären, wenn Sie mehr wissen wollen, sollten Sie auf bitweise Operatoren nachlesen und wie binäre Darstellung von Zahlen funktioniert.

Um herauszufinden, welche der Flags die Nummer 12414 hat, können Sie den Operator & (bitweises UND) verwenden und eine Nullprüfung durchführen. Zum Beispiel:

6 & 2 = 2 (110 has a 1 on the same position as 2, which is 010) 
6 & 1 = 0 (110 does not have a 1 on the same position as 1, which is 001) 
34

12414 in binary ist:

Binary number: 1 1 0 0 0 0 0 1 1 1 1 1 1 0 
------------------------------------------------------- 
Bit positions: 13 12 11 10 9 8 7 6 5 4 3 2 1 0 

Blick, mit der Bits 1. Das sind die Fahnen, die in der Bitmaske festgelegt sind, die unter Verwendung des bitweisen OR-Operator erstellt wird vereinen die Flags:

bitmask = TRADEABLE | SELLABLE | STORABLE | STORABLE_IN_WH | STORABLE_IN_LEGION_WH | BREAKABLE | BLACK_CLOUD_TRADERS | CAN_SPLIT; 

um dies weiter zu erklären, bedeutet, dass STORABLE = (1 << 3); STORABLE auf die Anzahl gleich eins ist (binär 1, nur in fallender Bitposition 0) shi nach links um 3 Plätze. Beachten Sie, dass STORABLE = Math.pow(2, 3); äquivalent wäre. Da sich keines der Bits unter den Flags überschneidet, können wir alle zu einem einzigen int kombinieren und sie später auseinander teilen.

Wir für die Existenz von Fahnen überprüfen können die bitweise AND-Operator, der einen Wert ungleich Null, wenn das Flag gesetzt ist und einen Wert von Null, wenn das Flag nicht gesetzt zurück:

if(bitmask & TRADEABLE != 0) { 
    // This item can be traded 
} else { 
    // This item cannot be traded 
} 

Wir kann Flags wie folgt setzen, löschen oder umschalten:

bitmask |= TRADEABLE; // Sets the flag using bitwise OR 
bitmask &= ~TRADEABLE; // Clears the flag using bitwise AND and NOT 
bitmask ^= TRADEABLE; // Toggles the flag using bitwise XOR 
+0

Vielen Dank, das ist wirklich eine einfache Möglichkeit zu überprüfen, ob eine Bitmaske etwas enthält oder nicht! – Prix