Establecer bit específico en byte


78

Estoy tratando de establecer bits en la variable de bytes de Java. Proporciona métodos adecuados como .setBit(i). ¿Alguien sabe cómo puedo darme cuenta de esto?

Puedo iterar bit a bit a través de un byte dado:

if( (my_byte & (1 << i)) == 0 ){

}

Sin embargo, no puedo establecer esta posición en 1 o 0, ¿verdad?



@phuclv Esa es una pregunta de C / C ++, no una pregunta de Java.
Mark Rotteveel

@MarkRotteveel se usa la misma sintaxis. De hecho, la etiqueta debería cambiarse de nombre a algo parecido a C
phuclv

@phuclv El hecho de que use la misma sintaxis, en mi opinión, no es una razón suficiente para cerrar como duplicado.
Mark Rotteveel

Respuestas:


143

Utilice los operadores OR ( |) y AND ( &) bit a bit . Para establecer un bit, es decir, gire el bit posa 1:

my_byte = my_byte | (1 << pos);   // longer version, or
my_byte |= 1 << pos;              // shorthand

Para desarmar un poco, o cambiarlo a 0:

my_byte = my_byte & ~(1 << pos);  // longer version, or
my_byte &= ~(1 << pos);           // shorthand

Para ver ejemplos, consulte Operadores avanzados de Java / bit a bit


3
consulte también el operador xor: es la tercera herramienta eléctrica de ese arsenal (consulte el artículo de Wikipedia sobre enmascaramiento).
Hardryv

Guau. esto es en realidad la materia informática básica, pero todavía me importaría soplado, mundo binario son increíbles
elliotching

67

Para establecer un poco:

myByte |= 1 << bit;

Para borrarlo:

myByte &= ~(1 << bit);

1
¿Qué quieres decir con que esto se "fijaría" un poco? digamos que estaba intentando acceder al bit 0, y myByte contiene 11101101. ¿Qué significa esto? ¿Cómo controlo cuál es el valor que se establece?
Michael

7
@Michael: Establecer un bit significa convertirlo en 1. Limpiar un bit significa convertirlo en 0.
Jon Skeet

26

Sólo para complementar la respuesta de Jon y respuesta driis'

Para alternar (invertir) un poco

    myByte ^= 1 << bit;

1
@ernesto pero no responde específicamente a la pregunta. Preguntó cómo configurar el bit, no alternarlo. Hay una diferencia. Por supuesto, primero puede verificar el bit y luego alternarlo si es necesario, pero también serían 2 tareas separadas ...
Justin Smith

12

La técnica que necesita es aislar el bit elegido y configurarlo o borrarlo. Ya tiene la expresión para aislar el bit, ya que la está usando para probarla arriba. Puede establecer el bit colocándolo en OR, o borrar el bit a bit a bit y con el complemento a 1 del bit.

boolean setBit;
my_byte = setBit
          ? myByte | (1 << i)
          : myByte & ~(1 << i);

8

Consulte la clase java.util.BitSet que hace el trabajo por usted.

Para configurar: myByte.set(bit); Para restablecer: myByte.clear(bit); Para completar con un bool: myByte.set(bit, b); Para obtener el bool: b = myByte.get(bit); Obtenga el mapa de bits:byte bitMap = myByte.toByteArray()[0];


3
Cuidado con bitset. No hay distinción entre establecer un bit en 0 y borrarlo, por length()lo tanto , no contaría esos bits establecidos en 0
Alex
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.