Domanda

Ho il seguente:

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

e volevo capire come viene calcolato di dare il risultato di follow, ad esempio: 12414

Sono davvero all'oscuro su come il lavoro maschera di bit e se qualcuno potrebbe forse dare alcuni suggerimenti e spiegare come va a quel numero Gradirei molto.

È stato utile?

Soluzione

Il (1 << n) espressione è equivalente a 2 elevato alla potenza di n.

Quando si scrive (1 << n) | (1 << m) questo è lo stesso di (1 << n) + (1 << m) finché n e m sono diversi. Così si può pensare ad esso in termini di semplici aggiunte, se lo si desidera.

Il numero 12414 in binario è 11000001111110 quindi è la somma (o OR bit a bit) dei seguenti flag:

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

Si noti che i flag che sono inclusi corrispondono ai bit impostati nella rappresentazione binaria di 12414, quando lette da destra a sinistra.

Altri suggerimenti

binario è:

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

Osservare quali bit sono 1. Quelli sono i flag che vengono impostati nella maschera di bit, che viene creato utilizzando l'operatore OR per combinare i flag:

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

Per spiegare ulteriormente questo, mezzi STORABLE = (1 << 3); che Storable è uguale al numero uno (1 binario, cadendo solo in posizione di bit 0) spostato verso sinistra 3 posti. Si noti che STORABLE = Math.pow(2, 3); sarebbe equivalente. Perché nessuno dei bit si sovrappongono tra le bandiere, possiamo combinare tutti loro in un unico int e poi dividerli a pezzi in seguito.

Siamo in grado di verificare l'esistenza delle bandiere utilizzando l'operatore AND bit a bit, che restituirà un valore diverso da zero se è impostato il flag e un valore pari a zero se il flag non è impostato:

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

Possiamo impostare, cancellare o levetta bandiere come questo:

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 sposta i bit nei valori a b a sinistra, imbottitura i nuovi bit a destra con zeri. 1 << n equivale a un numero intero con il solo nth bit (conteggio da 0 a destra) set, che è equivalente a 2 n .

12414 è 11.000.001,11111 milioni in binario. Pertanto è prodotto sommando costanti elencate di seguito. È possibile lavorare questo fuori vedendo il bit 1 da destra è impostato, quindi TRADEABLE è "set"; bit 7 non è impostato (è 0), quindi SOUL_BOUND non è "set". Si noti come i numeri di bit associano con i valori dichiarati (1 << n).

TRADEABLE
SELLABLE
STORABLE
STORABLE_IN_WH
STORABLE_IN_LEGION_WH
BREAKABLE
BLACK_CLOUD_TRADERS
CAN_SPLIT

Non capisco la domanda "come si calcola di dare il risultato di follow". (Che cosa viene calcolato?)

La cosa più importante da capire è che tutti i valori del computer vengono memorizzati in formato binario. Qualsiasi numero sarà una combinazione di 0 e 1 bit. Alcuni numeri hanno un solo 1 bit.

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

La mia ipotesi è che si prende qualche numero, come ad esempio il vostro esempio 12414, e capire quali proprietà sono contenute all'interno di esso.

Per esempio, dal momento che è 12414 11.000.001,11111 milioni in binario, tutto ciò che è collegato a è negoziabile, perché ANDing questo numero con la maschera vi darà un 1 nel secondo bit.

In binario, 12414 è 11000001111110. LIMIT_ONE in binario è 1 e il <<, che è l'operatore Bitshift sposta lo zero all'imbottitura sinistra con uno zero a destra. Pertanto, commerciabili in binario è 10 e così via fino unk16, che finisce per essere 1000000000000000. Ora si mettono questi valori insieme usando OR bit a bit, che mette in pratica un 1 su ogni posizione in cui almeno uno dei suoi operando ha un uno su quella posizione (l'operatore pipe '|' viene utilizzato nella maggior parte delle lingue).

Esempio:

100 | 10 = 110

Quindi, per arrivare a 12414, è necessario fare un OR bit a bit sui seguenti variabili: unk16, unk15, negoziabile, selleable, memorizzabili, memorizzabili in Wh, memorizzabili nella legione wh e fragile. La combinazione di quelli sulle diverse posizioni in ciascuna di queste variabili si dà binario 11.000.001,11111 milioni, che si rivela essere 12414 in decimale.

Questo è probabilmente il modo più semplice per spiegarlo, se volete saperne di più, si dovrebbe leggere su operatori bit a bit e come binario rappresentazione dei numeri opere.

Per scoprire quale delle bandiere del numero 12414 ha, è possibile utilizzare l'operatore & (AND bit a bit) e fare un controllo a zero. Ad esempio:

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top