2011-12-14 12 views
8

Tengo un valor DB de 3 bytes (DB_1, DB_2, DB_3). Necesito verificar DB_3 para bits específicos. Por ejemplo, tengo que ver si DB_3 == 11X0XXXX donde solo deben verificarse los bits 4, 6 y 7. Los bits marcados como X pueden tomar cualquier valor y no deben verificarse. ¡No estoy familiarizado con las operaciones de Bit en Java y me alegro por cualquier ayuda! Gracias!Comparación bit a bit Java de un byte

+1

Sugiero leer http://en.wikipedia.org/wiki/Bitwise_operation. –

Respuesta

20

Puede utilizar un AND bit a bit (& en Java) para llevar a cabo el enmascaramiento de bits específicos (la máscara es la segunda línea y sólo va a dejar que esos bits de la primera a través de la línea donde la máscara tiene un 1 [marcado con una flecha debajo del cálculo]):

11101001 
& 11010000 
---------- 
    11000000 
    ↑↑ ↑ 

Vas a conservar exactamente esos bits que eran 1 en ambos operadores, lo que en esencia se establece todos los bits a 0 que no están interesados.

lo que sólo tiene que ver

if (DB_3 & 0xD0 == 0xC0) { ... } 

0xD0 es la forma hexadecimal de 208 que es 11010000 en binario y desea saber si coincide con 0xC0 que es 192 o 11000000. Sabrá que todos los bits que no le importan (X es en su pregunta) ya son cero en este momento debido a la AND a nivel de bit.


ETA (2011-12-14 14:24): Al parecer Java 7 tiene binary integer literals, por lo que puede hacer

if (DB_3 & 0b11010000 == 0b11000000) { ... } 

que hace que la máscara más de manifiesto. Gracias, Glenn.

+2

Supongo que Java 7 tiene literales binarios: http://docs.oracle.com/javase/7/docs/technotes/guides/language/binary-literals.html – Glenn

4

Si bien el método de Joey funciona bien, aquí hay otra manera de hacerlo que yo personalmente creo siente más intuitivo.

Necesitará dos máscaras: MASK1 = 11000000 que define cómo debe verse DB_3, y MASK2 = 11010000 que define qué bits se deben tener en cuenta. 1 bits en MASK2 indican los bits que nos importan y 0 bits indican bits que no nos importan.

Haz un XOR con MASK1 e invierte eso, luego un Y con MASK2, y comprueba si el resultado es igual a MASK2. Las primeras dos operaciones colocarán 1 s donde coincidan DB_3 y MASK1. La tercera operación arrojará todos los dígitos en el resultado a 0 excepto los bits indicados por 1 s en MASK2.La comparación evalúa a true si y solo si DB_3 coincide con MASK1 en las posiciones indicadas por 1 s en .

int MASK1 = Integer.parseInt("11000000", 2); // tell parseInt to use base 2 
int MASK2 = Integer.parseInt("11010000", 2); 
boolean matches = (~(DB_3^MASK1) & MASK2) == MASK2; 

Ejemplo de las operaciones bit a bit:

11101001 
^ 11000000 
---------- 
    00101001 
~ 
---------- 
    11010110 
& 11010000 
---------- 
    11010000 

espero que era comprensible.

+0

Probablemente agregaría las máscaras de bits exactas como comentarios en lugar de usar 'parseInt', pero eso puede ser una preferencia personal (y sí, los comentarios podrían estar desactualizados). Pero Grenn señaló que existen literales binarios en Java por ahora, lo que hace que parezca más natural. – Joey

+0

Si tuviera que hacer esto "de verdad" probablemente calcule la representación decimal y agregue un comentario '// 208d = 11010000b' o algo así. El uso de 'parseInt' aquí fue principalmente por claridad, y que no pensé en usar ese comentario en ese momento ... –