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.
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 n
th 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.
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)