Cómo obtener el valor de un bit en una determinada posición de un byte?


Si tengo un byte, ¿cómo se vería el método para recuperar un bit en una posición determinada?

Esto es lo que sé, y no creo que funcione.

public byte getBit(int position) {
    return (byte) (ID >> (position - 1));
}

Donde ID es el nombre del byte del que estoy recuperando información.

Author: nbro, 2012-02-20

4 answers

public byte getBit(int position)
{
   return (ID >> position) & 1;
}

Desplazar a la derecha el ID por posición hará que la posición de bit #esté en el punto más alejado a la derecha del número. Combinando eso con el bitwise Y & con 1 le dirá si el bit está establecido.

position = 2
ID = 5 = 0000 0101 (in binary)
ID >> position = 0000 0001

0000 0001 & 0000 0001( 1 in binary ) = 1, because the furthest right bit is set.
 78
Author: Hunter McMillen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-21 09:22:09

Desea hacer una máscara de bits y hacer bitwise y. Eso terminará pareciendo muy cercano a lo que tienes use usa shift para establecer el bit apropiado, usa & para hacer un op bitwise.

So

 return ((byte)ID) & (0x01 << pos) ;

Donde pos tiene que oscilar entre 0 y 7. Si tiene el bit menos significativo como "bit 1", entonces necesita su -1 pero lo recomendaría en contra that ese tipo de cambio de posición siempre es una fuente de errores para mí.

 7
Author: Charlie Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-20 00:41:22

Para obtener el enésimo bit en entero

 return ((num >> (n-1)) & 1);
 0
Author: src3369,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-14 00:28:08

En Java lo siguiente funciona bien:

if (value << ~x < 0) {
   // xth bit set
} else {
   // xth bit not set
}

value y x puede ser int o long (y no es necesario que sea lo mismo).

Word of caution for non-Java programmers: la expresión anterior funciona en Java porque en ese lenguaje los operadores de desplazamiento de bits se aplican solo a los 5 (o 6, en el caso de long) bits más bajos del operando del lado derecho. Esto traduce implícitamente la expresión a value << (~x & 31) (o value << (~x & 63) si value es long).

Javascript : it también funciona en javascript (al igual que Java, solo se aplican los 5 bits más bajos de conteo de cambios). En javascript cualquier number es de 32 bits.

Particularmente en C, el conteo de desplazamiento negativo invoca un comportamiento indefinido, por lo que esta prueba no necesariamente funcionará (aunque puede, dependiendo de su combinación particular de compilador/procesador).

 0
Author: rslemos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-05 19:43:41