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");