Pregunta

Tengo la siguiente manera:

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: 12414

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 agradecería mucho.

¿Fue útil?

Solución

El (1 << n) expresió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. Así que usted puede pensar en ella en términos de adiciones simples si lo desea.

El 12414 número en binario es 11000001111110 por lo que es la suma (o OR bit a bit) 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

Tenga en cuenta que las banderas que se incluyen corresponden a los bits que están activos en la representación binaria de 12414, cuando se lee de derecha a izquierda.

Otros consejos

binaria 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

Look 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 para combinar las banderas:

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

Para explicar mejor esto, medios STORABLE = (1 << 3); que almacenables es igual al número uno (1 binario, cayendo sólo en la posición de bit 0) desplaza 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 de superposición entre las banderas, podemos combinar todos ellos en un solo int y luego dividir separarlos más tarde.

puede 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
}

Podemos establecer, borrar, o alternar banderas como esta:

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 desplaza los bits en los valores a b a la izquierda, el relleno de los nuevos bits a la derecha con ceros. 1 << n equivale a un número entero con sólo el bit nth (contando desde 0 de la derecha) conjunto, lo que equivale a 2 n .

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

TRADEABLE
SELLABLE
STORABLE
STORABLE_IN_WH
STORABLE_IN_LEGION_WH
BREAKABLE
BLACK_CLOUD_TRADERS
CAN_SPLIT

No entiendo la pregunta "¿cómo se calcula que dé el resultado de seguimiento". (Lo que se calcula?)

Lo más importante a entender es que todos los valores de ordenador se almacenan en el sistema binario. Cualquier número será una combinación de 0 y 1 bit. Algunos números sólo tienen un 1 bit.

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

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, ya es 11000001111110 12414 en binario, lo que se une a es negociable, porque AND de este número con la máscara le dará un 1 en el segundo bit.

En binario, 12414 es 11000001111110. LIMIT_ONE en binario es 1 y el <<, que es el operador mueve el BitShift cero a la izquierda de relleno con un cero a la derecha. Por lo tanto, negociable en binario es 10 y así sucesivamente hasta unk16, que termina siendo 1000000000000000. Ahora pones juntos estos valores utilizando OR bit a bit, lo que básicamente pone un 1 en cada posición en la que al menos uno de su operando tiene el que está en esa posición (el operador de la tubería '|' se utiliza 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 legión WH y rompible. La combinación de los de las diferentes posiciones en cada una de estas variables le da binaria 11000001111110, que resulta ser 12.414 en decimal.

Esta es probablemente la forma más sencilla de explicarlo, si usted quiere saber más, usted debe leer sobre operadores de bits y cómo la representación de números binarios obras.

Para saber cuál de las banderas del número 12414 tiene, puede utilizar el operador Y (AND bit a bit) y hacer una verificación de 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top