tutorial reloj original identificar español como c++11 int bit-manipulation bit

c++11 - español - como identificar un reloj original



Comparación racional de bits (2)

Tengo un número de tipo int. Se encuentra dentro de [0,255]. Es decir, incluye 8 bits. Necesito verificar a menudo decir:

2 (int) = 00000010 (binario)

1. The bit 6 and bit 7 must be equal to 0 and 1 respectively. And I check it like this:

if ((!(informationOctet_ & (1 << 6))) && (informationOctet_ & (1 << 7))) { ... }

Pero no es muy legible, si es posible, ¿hacer algo "hermoso"? No puedo usar std :: bitset, mi cabeza dice que es una pérdida de recursos y que no puedes prescindir de ella.


Hay dos soluciones razonables: establecer todos los bits de no importa a cero, y luego probar el resultado, o establecer los bits de no importa a uno y probar el resultado:

(x & 0xC0) == 0x80 (x | ~0xC0) == ~0x40

Como Harold señaló en el comentario, la primera forma es mucho más común. Este patrón es tan común que el optimizador de su compilador lo reconocerá.

Existen otras formas, pero son oscuras: ((x ^ 0x80) & 0xC0 == 0) funciona igual de bien pero es menos claro. Algunos ISA no pueden cargar constantes grandes directamente, por lo que usan el equivalente de ((x>>6) & 0x3) == 0x2 . No te molestes con esto, tu optimizador lo hará.


Puede aplicar algunas técnicas de enmascaramiento como,

int i = 246; // Lets say any value. int chk = ( i & 00000110b ); // eliminates all other bits except 6th & 7th bit if (chk == 2) // because we want to check 6th bit is 0 & 7th is 1, that becomes 2 value in decimal printf("The 6th bit is 0 & 7th bit is 1"); else printf("Either 6th bit is not 0 or 7th bit is not 1, or both are not 0 & 1 respectivly");