Establecer bit específico en byte

3 minutos de lectura

Estoy tratando de establecer bits en la variable de bytes de Java. Proporciona métodos apropiados 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, ¿o sí?

  • Posible duplicado de ¿Cómo configura, borra y alterna un solo bit?

    – phuclv

    26 de enero de 2019 a las 3:28

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

    – Mark Rotteveel

    26 de enero de 2019 a las 9:41

  • @MarkRotteveel se usa la misma sintaxis. De hecho, la etiqueta debe cambiarse de nombre a algo como C-like

    – phuclv

    26 de enero de 2019 a las 9:43

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

    – Mark Rotteveel

    26 de enero de 2019 a las 9:44

avatar de usuario
dris

Usar bit a bit O (|) y Y (&) operadores. Para configurar un bit, es decir, girar el bit en pos para 1:

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

Para desarmar un poco, o convertirlo en 0:

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

Para ver ejemplos, véase Operadores Java/bit a bit avanzados

  • vea también el operador xor — es la tercera herramienta poderosa en ese arsenal (vea el artículo de Wikipedia sobre enmascaramiento).

    – Hardryv

    29 de marzo de 2012 a las 17:35

  • Guau. esto es en realidad cosas básicas de informática, pero aún así me alucinó, el mundo binario es increíble

    – elliotching

    5 de noviembre de 2019 a las 5:13

Para poner un poco:

myByte |= 1 << bit;

Para borrarlo:

myByte &= ~(1 << bit);

  • ¿Qué quieres decir con que esto se “establecería” un poco? Digamos que estaba tratando de acceder al bit 0 y myByte contiene 11101101. ¿Qué significa esto? ¿Cómo controlo cuál es el valor que se establece?

    – Miguel

    6 de marzo de 2016 a las 5:08


  • @Michael: Establecer un bit significa convertirlo en 1. Borrar un bit significa convertirlo en 0.

    – Jon Skeet

    6 de marzo de 2016 a las 8:50

avatar de usuario
usuario85421

Solo para complementar la respuesta de Jon y la respuesta de driis.

Para alternar (invertir) un poco

    myByte ^= 1 << bit;

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

    –Justin Smith

    27 mayo 2016 a las 22:50

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

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

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

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

  • Cuidado con el conjunto de bits. No hay distinción entre establecer un bit en 0 y borrarlo, por lo tanto length() no contaría esos bits establecidos en 0

    – Alex

    13 de octubre de 2015 a las 9:28

  • Cuidado con el conjunto de bits. No hay distinción entre establecer un bit en 0 y borrarlo, por lo tanto length() no contaría esos bits establecidos en 0

    – Alex

    13 de octubre de 2015 a las 9:28

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad