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?

wishi
fuente
@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

driis
fuente
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);
Jon Skeet
fuente
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;
usuario85421
fuente
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);
Jeffrey Hantin
fuente
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];

sebyku
fuente
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