Frage

Ich habe das folgende:

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 berechnet wird, um das folgende Ergebnis zu geben, zum Beispiel: 12414

Ich bin wirklich ahnungslos darüber, wie die Bitmaske funktioniert, und wenn jemand vielleicht ein paar Tipps geben und erklären könnte, wie es zu dieser Zahl geht, würde ich mich sehr schätzen.

War es hilfreich?

Lösung

Der Ausdruck (1 << n) entspricht 2 an die Macht von n.

Wenn Sie schreiben (1 << n) | (1 << m) Dies ist dasselbe wie (1 << n) + (1 << m) so lange wie n und m sind anders. Sie können es also in Bezug auf einfache Ergänzungen vorstellen, wenn Sie dies wünschen.

Die Nummer 12414 in binär ist 11000001111110 Es ist also die Summe (oder bitweise oder) 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

Beachten Sie, dass die enthaltenen Flags den Bits entsprechen, die in der binären Darstellung von 12414 festgelegt sind, wenn Sie von rechts nach links gelesen werden.

Andere Tipps

12414 in binär 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

Schauen Sie sich an, welche Bits 1. Dies sind die Flags, die in der Bitmaske festgelegt sind, die durch Bitweise oder Bediener erstellt werden, um die Flags zu kombinieren:

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

Um dies weiter zu erklären, STORABLE = (1 << 3); bedeutet, dass das Speicher gleich die Nummer eins ist (binär 1, nur in Bitposition 0), die um 3 Stellen nach links verschoben wurde. Beachten Sie, dass STORABLE = Math.pow(2, 3); wäre äquivalent. Da sich keiner der Bits zwischen den Flaggen überlappt, können wir alle zu einem einzigen int kombinieren und sie später auseinander teilen.

Wir können nach dem Bitgewise and Operator nach der Existenz von Flags überprüfen, was einen Wert ungleich Null zurückgibt, wenn das Flag eingestellt ist, und ein Nullwert, wenn das Flag nicht festgelegt ist:

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

Wir können wie folgt festlegen, klären 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 

a << b verschiebt die Teile in a b Werte links, die neuen Bits rechts mit Nullen auffüllen. 1 << n entspricht einer Ganzzahl mit nur der nTH Bit (Zählen von 0 von rechts), was äquivalent zu 2 entsprichtn.

12414 ist 11000001111110 in binär. Daher wird es hergestellt, indem die unten aufgeführten Konstanten summiert werden. Sie können dies ausarbeiten, indem Sie sehen, dass das Bit 1 von rechts festgelegt ist, ist daher festgelegt TRADEABLE ist "set"; Bit 7 ist nicht eingestellt (es ist 0), deshalb ist es SOUL_BOUND ist nicht "gesetzt". Beachten Sie, wie die Bitzahlen mit den deklarierten Werten von assoziieren (1 << n).

TRADEABLE
SELLABLE
STORABLE
STORABLE_IN_WH
STORABLE_IN_LEGION_WH
BREAKABLE
BLACK_CLOUD_TRADERS
CAN_SPLIT

Ich verstehe die Frage "Wie sie berechnet wird, um das folgende Ergebnis zu geben". (Was wird berechnet?)

Die Hauptsache zu verstehen ist, dass alle Computerwerte in binär gespeichert sind. Eine beliebige Zahl ist eine Kombination von 0 und 1 Bit. Einige Zahlen haben nur ein Bit.

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

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

Da 12414 beispielsweise 11000001111110 in Binärer ist, ist das, was sie angeschlossen sind, gehandeltbar, da Sie diese Zahl mit der Maske im zweiten Bit ein 1 geben.

In Binary ist 12414 11000001111110. limit_one in Binary IS 1 und das <<, das ist der Bitverschiebungsoperator, bewegt die Null mit einer Null rechts auf die linke Polsterung. Daher beträgt der Handel in Binärzus 10 bis zu Unk16, was endet 1000000000000000 (Der Rohroperator '|' wird in den meisten Sprachen verwendet).

Beispiel:

100 | 10 = 110

Um zu 12414 zu gelangen, müssen Sie daher ein bitweise oder auf folgende Variablen durchführen: UNK16, UNK15, handelbar, verblätig, lagerbar, aufbewahrt, in der Legion WH und brechen. Die Kombination derjenigen auf den verschiedenen Positionen in jeder dieser Variablen ergibt eine binäre 11000001111110, die sich als 12414 in Dezimalzahl herausstellt.

Dies ist wahrscheinlich der einfachste Weg, um es zu erklären. Wenn Sie mehr wissen möchten, sollten Sie sich über bitweise Operatoren und die Funktionsweise der Binärdarstellung von Zahlen informieren.

Um herauszufinden, welches der Flags die Nummer 12414 hat, können Sie den & (bitweisen und) Bediener 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top