bitwise - ¿Cómo revisar mi bandera de bytes?
bitwise operators javascript (10)
Aquí hay una función que puede usarse para probar cualquier bit deseado:
bool is_bit_set(unsigned value, unsigned bitindex)
{
return (value & (1 << bitindex)) != 0;
}
Un poco de explicación:
El operador de desplazamiento a la izquierda (<<) se usa para crear una máscara de bits. (1 << 0) será igual a 00000001, (1 << 1) será igual a 00000010, (1 << 3) será igual a 00001000, etc. Así que un cambio de 0 prueba el bit de la derecha. Un cambio de 31 sería el bit más a la izquierda de un valor de 32 bits.
El operador bit a bit (&) da un resultado donde se establecen todos los bits que son 1 en ambos lados. Ejemplos: 1111 y 0001 = 0001; 1111 y 0010 == 0010; 0000 & 0001 = 0000. Entonces, la expresión (valor & (1 << bitindex)) devolverá la máscara de bits si el bit asociado tiene 1 valor, o devolverá 0 si el bit asociado es 0.
Finalmente, simplemente verificamos si el resultado es distinto de cero. (Esto en realidad podría omitirse, pero me gustaría hacerlo explícito).
Utilizo un byte para almacenar una bandera como 10101010
y me gustaría saber cómo verificar que un bit específico esté en 1
o 0
.
La respuesta de Kristopher Johnson es muy buena si te gusta trabajar con campos individuales como este. Prefiero hacer que el código sea más fácil de leer mediante el uso de campos de bits en C.
Por ejemplo:
struct fieldsample
{
unsigned short field1 : 1;
unsigned short field2 : 1;
unsigned short field3 : 1;
unsigned short field4 : 1;
}
Aquí tiene una estructura simple con cuatro campos, cada uno de 1 bit de tamaño. Luego puede escribir su código usando el acceso de estructura simple.
void codesample()
{
//Declare the struct on the stack.
fieldsample fields;
//Initialize values.
fields.f1 = 1;
fields.f2 = 0;
fields.f3 = 0;
fields.f4 = 1;
...
//Check the value of a field.
if(fields.f1 == 1) {}
...
}
Obtiene la misma ventaja de tamaño pequeño, además de código legible porque puede dar a sus campos nombres significativos dentro de la estructura.
Nadie ha estado equivocado hasta ahora, pero para dar un método para verificar un bit arbitrario:
int checkBit( byte in, int bit )
{
return in & ( 1 << bit );
}
Si la función devuelve un valor distinto de cero, el bit se establece.
Puede usar un operador AND. Por ejemplo, tiene: 10101010 y desea verificar el tercer bit que puede hacer: (10101010 Y 00100000) y si obtiene 00100000, sabrá que tiene la bandera en la tercera posición en 1.
Si está utilizando C ++ y está permitida la biblioteca estándar, le sugiero que almacene sus banderas en un conjunto de bits:
#include <bitset>
//...
std::bitset<8> flags(someVariable);
como entonces puede verificar y establecer indicadores usando el operador de indexación [].
Tradicionalmente, para verificar si el bit más bajo está configurado, se verá algo así como:
int MY_FLAG = 0x0001;
if ((value & MY_FLAG) == MY_FLAG)
doSomething();
Use un bitwise (¡no lógico!) Y compare el valor con una máscara de bits.
if (var & 0x08) {
/* the fourth bit is set */
}
puedes hacer lo que dice Daok y mejorar un poco O al resultado de la operación AND anterior. En este caso, tendrá un resultado final de 1 o 0.
byte THIRDBIT = 4; // 4 = 00000100 i.e third bit is set
int isThirdBitSet(byte in) {
return in & THIRDBIT; // Returns 1 if the third bit is set, 0 otherwise
}
Como una extensión de la respuesta de @Daoks
Al hacer la manipulación de bits, realmente ayuda a tener un conocimiento muy sólido de los operadores bit a bit .
Además, el operador "AND" bit a bit en C es &
, así que lo que quieres hacer es:
unsigned char a = 0xAA; // 10101010 in hex
unsigned char b = (1 << bitpos); //Where bitpos is the position you want to check
if(a & b) {
//bit set
}
else {
//not set
}
Arriba utilicé el bit "AND" (& en C) para verificar si un bit en particular estaba configurado o no. También utilicé dos formas diferentes de formular números binarios. Te recomiendo que revises el enlace de Wikipedia arriba.