El "valor" varía de 0 a 15 (sus posibles valores). ¿Cuándo se cumplirán esas 4 condiciones "si"? Si mi (int) valor = 2, ¿significa esto 0010?
if ((int)value & 0x1)
{
//statement here
}
if ((int)value & 0x2)
{
//statement here
}
if ((int)value & 0x4)
{
//statement here
}
if ((int)value & 0x8)
{
//statement here
}
c++
bitwise-operators
Sean McCarthy
fuente
fuente
value
(leerif(value & 0x4)
como "Es el 3er bit delvalue
conjunto (= 1)). Como aparentemente tiene problemas para entender el código, supongo que no es suyo. Esto (y el hecho de que no está preguntando para su revisión) hace que esta pregunta fuera del tema de CR.SE .Enum.HasFlag
método para probar bits. Ver: Enum.HasFlag .Respuestas:
Cada número se puede expresar como si
value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...
cada b fuera uno0
o1
(estos son los bits de la representación). Esta es la representación binaria.El binario AND (
&
) toma cada uno de esosb
pares sabios y realiza AND en ellos. Esto tiene las siguientes salidas:Usando potencias de 2 (que tienen solo un bit) podemos aislar y probar los bits individuales:
value & 1
es verdadero cuandovalue
es impar {1, 3, 5, 7, 9, 11, 13, 15}.value & 2
es verdadero cuandovalue/2
es impar {2, 3, 6, 7, 10, 11, 14, 15}.value & 4
es verdadero cuandovalue/4
es impar {4, 5, 6, 7, 12, 13, 14, 15}.value & 8
es verdadero cuandovalue/8
es impar {8, 9, 10, 11, 12, 13, 14, 15}.El prefijo 0x en los números significa que debe interpretarse como un número hexadecimal . Es un poco superfluo cuando solo sube a 0x8, pero le dice a los mantenedores que probablemente se use como una máscara de bits.
fuente
8/6
es impar, mientras que8&6
produce falso.Estas sentencias if comprueban si se establece un bit específico de
value
.El valor hexadecimal
0x4
, por ejemplo, tiene el tercer bit del conjunto correcto a1
y todos los demás bits establecidos a0
. Cuando utiliza el operador binario y (&
) con dos operantes, el resultado tendrá todos los bits configurados a0
excepción de aquellos bits que son 1 en ambos operantes.Entonces, cuando haces el cálculo
value & 0x4
, obtienes binario00000000
o binario00000100
, dependiendo de si el tercer bit devalue
es1
o no0
. El primero se evalúa enfalse
, y el segundo entrue
, por lo que el bloque if solo se ejecuta para valores donde se establece el tercer bit.fuente
Hay dos cosas interesantes a tener en cuenta aquí.
Primero, este es un patrón común para verificar cada uno de los 4 bits de orden inferior de un valor integral. La condición if se cumple si se establece el bit correspondiente. Para el valor 2, el patrón de bits es de hecho 0010.
La otra pregunta más interesante es ¿por qué el
(int)
elenco? Además del mal estilo de usar C-casts en C ++, ningún valor entero o de caracteres requiere este elenco. Un bool no tiene sentido, un doble / flotante se convertiría en un entero temporal y sería inusual usar valores literales para probar una enumeración. Puede tener sentido con un puntero, pero ese sería un uso muy especializado. Conclusión: el elenco no tiene sentido.fuente