O "valor" varia de 0 a 15 (seus valores possíveis). Quando essas 4 condições "se" serão atendidas? Se meu (int) valor = 2, isso significa 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
fonte
fonte
value
(leia-seif(value & 0x4)
"É o terceiro bit dovalue
conjunto (= 1)). Como você aparentemente tem problemas para entender o código, presumo que ele não seja o seu. Isso (e o fato de você não estar perguntando para revisão) faz esta pergunta off-topic para CR.SE .Enum.HasFlag
método para testar bits. Veja: Enum.HasFlag .Respostas:
Cada número pode ser expresso como
value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...
cada b sendo um0
ou1
(estes são os bits da representação). Esta é a representação binária.O AND binário (
&
) leva cada um dessesb
pares de maneira sábia e executa E neles. Isso tem as seguintes saídas:Usando potências de 2 (que possuem apenas um único bit), podemos isolar e testar os bits individuais:
value & 1
é verdadeiro quandovalue
é ímpar {1, 3, 5, 7, 9, 11, 13, 15}.value & 2
é verdadeiro quandovalue/2
é ímpar {2, 3, 6, 7, 10, 11, 14, 15}.value & 4
é verdadeiro quandovalue/4
é ímpar {4, 5, 6, 7, 12, 13, 14, 15}.value & 8
é verdadeiro quandovalue/8
é ímpar {8, 9, 10, 11, 12, 13, 14, 15}.O prefixo 0x nos números significa que ele deve ser interpretado como um número hexadecimal . É um pouco supérfluo quando você atinge apenas 0x8, mas informa aos mantenedores que provavelmente é usado como máscara de bit.
fonte
8/6
é ímpar, enquanto8&6
produz falso.Essas instruções if verificam se um bit específico
value
está definido.O valor hexadecimal
0x4
, por exemplo, tem o terceiro bit da direita definido como1
e todos os outros bits definidos como0
. Quando você usa o binário- e o operador (&
) com dois operantes, o resultado terá todos os bits definidos,0
exceto os bits que são 1 nos dois operadores.Portanto, quando você faz o cálculo
value & 0x4
, você fica binário00000000
ou binário00000100
, dependendo de o terceiro bit devalue
ser1
ou não0
. O primeiro avalia comofalse
, e o segundotrue
, para que o bloco if seja executado apenas para valores em que o terceiro bit está definido.fonte
Há duas coisas interessantes a serem observadas aqui.
Primeiro, esse é um padrão comum para verificar cada um dos 4 bits de ordem inferior de um valor integral. A condição if é atendida se o bit correspondente estiver definido. Para o valor 2, o padrão de bits é de fato 0010.
A outra pergunta mais interessante é por que o
(int)
elenco? Além do estilo ruim de usar conversão C em C ++, nenhum valor inteiro ou caractere exige essa conversão. Um bool não faz sentido, um double / float seria convertido em um número inteiro temporário e seria incomum usar valores literais para testar uma enumeração. Pode fazer sentido com um ponteiro, mas isso seria um uso muito especializado. Conclusão: o elenco não faz sentido.fonte