2010-12-28 25 views
22

tengo el siguiente:pregunta de máscara de bits?

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

y quería entender cómo se calcula que dé el resultado de seguimiento, por ejemplo:

estoy realmente ni idea de cómo el trabajo de máscara de bits y si cualquiera podría quizás dar algunos consejos y explicar cómo va a ese número, lo apreciaría mucho.

+0

¿quieres saber qué '' << hace? No entiendo la pregunta. –

+0

@Nikita del conjunto anterior. Quería saber cómo genera la máscara de bits 12414 y cómo revertirla. – Prix

Respuesta

20

La expresión (1 << n) es equivalente a 2 elevado a la potencia de n.

Cuando se escribe (1 << n) | (1 << m) esto es lo mismo que (1 << n) + (1 << m), siempre y cuando n y m son diferentes. Entonces puedes pensarlo en términos de simples adiciones si lo deseas.

El número 12414 en binario es 11000001111110 por lo que es la suma (o bit a bit OR) de los siguientes indicadores:

 
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 

Nota que las banderas que se incluyen corresponden a los bits que se establecen en el binario representación de 12414, cuando se lee de derecha a izquierda.

+1

Correcto, pero tal vez se le preguntó cómo encontrar qué banderas están almacenadas en un número determinado (por ejemplo, 12414) - está buscando el operador '&' imho. – Konerak

+0

Entonces (1 << 1) resultaría en 2? y (1 << n) + (1 << m) daría como resultado 14 donde n = 3 y m = 4? – Prix

+0

@Konerak sí Quería saber cómo revertirlo desde ese número. – Prix

0

No entiendo la pregunta "cómo se calcula para dar el siguiente resultado". (¿Qué se calcula?)

Lo principal es que todos los valores de la computadora se almacenan en binario. Cualquier número será una combinación de 0 y 1 bit. Algunos números solo tienen un 1 bit.

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

5

a << b desplaza los bits en ab valores a la izquierda, el relleno de los nuevos bits a la derecha con ceros. 1 << n equivale a un número entero con solo n th bit (contando desde 0 de la derecha) establecido, que es equivalente a 2 n.

12414 es 11000001111110 en binario. Por lo tanto, se produce al sumar las constantes enumeradas a continuación. Puede resolver esto viendo que el bit 1 de la derecha está configurado, por lo tanto, TRADEABLE está "configurado"; el bit 7 no está configurado (es 0), por lo tanto, SOUL_BOUND no está "configurado". Observe cómo los números de bit se asocian con los valores declarados de (1 << n).

TRADEABLE 
SELLABLE 
STORABLE 
STORABLE_IN_WH 
STORABLE_IN_LEGION_WH 
BREAKABLE 
BLACK_CLOUD_TRADERS 
CAN_SPLIT 
+0

++ ¡Eres rápido! Pásame a eso. –

0

Mi conjetura sería que se tome un número, como su ejemplo 12414, y averiguar qué propiedades están contenidas dentro de ella.

Por ejemplo, dado que 12414 es 11000001111110 en binario, lo que sea que esté unido es negociable, porque ANDing este número con la máscara le dará un 1 en el segundo bit.

0

En binario, 12414 es 11000001111110. LIMIT_ONE en binario es 1 y < <, que es el operador de desplazamiento de bits mueve el cero al relleno izquierdo con un cero a la derecha. Por lo tanto, el binario intercambiable es 10 y así sucesivamente hasta unk16, que termina siendo 1000000000000000. Ahora se juntan estos valores utilizando O bit a bit, que básicamente pone un 1 en cada posición donde al menos uno de sus operandos tiene uno en esa posición (el operador de tubería '|' se usa en la mayoría de los idiomas).

Ejemplo:

100 | 10 = 110 

Por lo tanto, llegar a 12.414, lo que necesita hacer un OR de las siguientes variables: unk16, unk15, negociable, selleable, storeable, storeable en Wh, storeable en Wh legión y rompible. La combinación de los que están en las diferentes posiciones en cada una de estas variables le da un valor binario de 11000001111110, que resulta ser 12414 en decimal.

Esta es probablemente la forma más simple de explicarlo, si quiere saber más, debe leer sobre operadores bit a bit y cómo funciona la representación binaria de números.

Para saber cuál de las banderas tiene el número 12414, puede usar el operador & (AND bit a bit) y hacer una comprobación cero. Por ejemplo:

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 en binary es:

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 

mirada a la que los bits son 1. Esas son las banderas que se establecen en la máscara de bits, que se crea utilizando el operador binario OR a combinar las banderas:

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

para explicar mejor esto, STORABLE = (1 << 3); significa que almacenables es igual al número uno (1 binario, cayendo sólo en la posición de bit 0) shi fted a la izquierda por 3 lugares. Tenga en cuenta que STORABLE = Math.pow(2, 3); sería equivalente. Debido a que ninguno de los bits se superpone entre los indicadores, podemos combinarlos todos en un único int y luego dividirlos más tarde.

Podemos comprobar la existencia de banderas utilizando el operador AND, que devolverá un valor distinto de cero si se establece el indicador y un valor de cero si la bandera no está definida:

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

Nosotros puede establecer o banderas claras, de palanca como este:

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

¡muchas gracias que es realmente una manera fácil de verificar si una máscara de bits contiene algo o no! – Prix

Cuestiones relacionadas