trabajar sentido rotacion mascaras mascara manipulacion manejo hacer figurado ejemplos desplazamiento con como binarios java bitmask

java - sentido - pregunta de la máscara de bits?



rotacion de bits en c (6)

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

Mire qué bits son 1. Esas son las banderas que se establecen en la máscara de bits, que se crea utilizando el operador OR a nivel de bits para combinar las banderas:

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

Para explicar esto más STORABLE = (1 << 3); , STORABLE = (1 << 3); significa que ALMACENAMIENTO es igual al número uno (1 binario, cayendo solo en la posición de bit 0) desplazado a la izquierda en 3 lugares. Tenga en cuenta que STORABLE = Math.pow(2, 3); Seria equivalente. Debido a que ninguno de los bits se superponen entre las banderas, podemos combinarlos todos en un solo int y luego separarlos.

Podemos verificar la existencia de indicadores utilizando el operador AND a nivel de bits, que devolverá un valor distinto de cero si el indicador está establecido y un valor de cero si el indicador no está establecido:

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

Podemos establecer, borrar o alternar las banderas de esta manera:

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

Tengo el siguiente:

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 para dar el siguiente resultado, por ejemplo: 12414

Realmente no tengo ni idea de cómo funciona la máscara de bits y si alguien pudiera dar algunos consejos y explicar cómo va ese número, lo apreciaría mucho.


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 intercambio en binario es 10 y así sucesivamente hasta unk16, que termina siendo de 1000000000000000. Ahora pones estos valores juntos usando OR a nivel de bit, que básicamente coloca 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, para llegar a 12414, debe hacer un OR a nivel de bits en las siguientes variables: unk16, unk15, negociable, vendible, almacenable, almacenable en wh, almacenable en legión wh y rompible. La combinación de unos en las diferentes posiciones en cada una de estas variables le da un binario 11000001111110, que resulta ser 12414 en decimal.

Esta es probablemente la forma más sencilla de explicarlo; si desea saber más, debe leer sobre operadores bitwise 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 & (bitwise AND) y realizar una comprobació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)


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

Cuando escribas (1 << n) | (1 << m) (1 << n) | (1 << m) es lo mismo que (1 << n) + (1 << m) siempre que n y m sean diferentes. Así que puedes pensar en términos de simples adiciones si lo deseas.

El número 12414 en binario es 11000001111110 por lo que es la suma (o en modo de bits 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

Tenga en cuenta que los indicadores que se incluyen corresponden a los bits que se establecen en la representación binaria de 12414, cuando se leen de derecha a izquierda.


Mi conjetura sería que tome algún número, como su ejemplo 12414, y descubra qué propiedades están contenidas en él.

Por ejemplo, dado que 12414 es 11000001111110 en binario, se puede intercambiar cualquier cosa con la que esté conectado, ya que el AND con este número con la máscara le dará un 1 en el segundo bit.


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

Lo principal a entender 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 1 bit.

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


a << b desplaza los bits en valores b a la izquierda, rellenando los nuevos bits a la derecha con ceros. 1 << n equivale a un entero con el conjunto del bit n th (contando desde 0 desde la derecha), que es equivalente a 2 n .

12414 es 11000001111110 en binario. Por lo tanto, se produce sumando las constantes enumeradas a continuación. Puede resolver esto viendo que el bit 1 de la derecha está establecido, por TRADEABLE tanto, TRADEABLE está "establecido"; el bit 7 no está establecido (es 0), por SOUL_BOUND tanto, SOUL_BOUND no está "establecido". 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