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
Respuesta
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.
Supongo que Java 7 tiene literales binarios: http://docs.oracle.com/javase/7/docs/technotes/guides/language/binary-literals.html – Glenn
Es similar a C. Comprobar: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
Tienes que usar Máscaras. Haces un poco de operación con el valor y la máscara.
El resultado contendrá solo el bit si se estableció en el valor.
+1 por ese enlace muy informativo – epoch
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.
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
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 ... –
- 1. C bit opera/copia un bit de un byte a otro byte
- 2. Reemplazar bit menos significativo con operaciones bit a bit
- 3. AND bit a bit, bit a bit pregunta Incluido O, en Java
- 4. Arrays de desplazamiento bit a bit
- 5. Obtiene un bit específico del byte
- 6. ¿Puedo usar OR bit a bit para enumeraciones de Java
- 7. PHP matriz bit a bit
- 8. Establecer bit específico en el byte
- 9. Implementación de ArrayDeque.allocateElements (operaciones bit a bit)
- 10. Java - desplazamiento circular usando operaciones bit a bit
- 11. Bit de inicio vs Start Byte
- 12. Operaciones bit a bit en el corto
- 13. Python: aritmética bit a bit sin signo de 32 bit
- 14. Efecto de un operador bit a bit en un booleano en Java
- 15. operaciones bit a bit en Postgres
- 16. Indicadores de bit a bit en Delphi
- 17. aplicaciones prácticas de operaciones bit a bit
- 18. Operadores de bit a bit y "endianness"
- 19. Lua - Operaciones lógicas de bit a bit
- 20. bit a bit de sustracción en Python
- 21. OR bit a bit de las constantes
- 22. Explicación de bit a bit NO operador
- 23. Operador bit a bit para obtener bytes de 32 bits
- 24. Operador bit a bit en firebird
- 25. Operador bit a bit en SQLAlchemy
- 26. ¿Qué son los operadores bit a bit?
- 27. operadores bit a bit en Postgres
- 28. Operaciones bit a bit con enteros grandes
- 29. operaciones bit a bit MySQL y filtrar
- 30. Java performance 64 bit
Sugiero leer http://en.wikipedia.org/wiki/Bitwise_operation. –