int temp = 0x5E; // in binary 0b1011110.
Existe uma maneira de verificar se o bit 3 em temp é 1 ou 0 sem deslocamento de bit e mascaramento.
Só quero saber se existe alguma função incorporada para isso ou se sou forçado a escrever uma.
c++
c
bit-manipulation
Milão
fonte
fonte
!= 0
é verdade, então por que se preocupar?1
é exatamente tão verdadeiro quanto0.1415
!std::bitset
, realmente? Claro, ao invés de fazer um pequeno trabalho (e potencialmente alguns modelos realmente bons) para verificar um único bit, use um contêiner inchado que armazena (na minha implementação) cada 'bit' em um de outra forma não utilizadounsigned long
. Que desperdício de espaço!Verifique se o bit N (começando em 0) está definido:
Não há função embutida para isso.
fonte
1 << 0
?? Desculpe, confuso.1<<0
, que é 1 sem qualquer deslocamento (deslocamento 0), que é1<<0 == 1
Eu usaria apenas um std :: bitset se for C ++. Simples. Direto. Sem chance para erros estúpidos.
ou que tal essa bobagem
fonte
std::bitset<CHAR_BIT * sizeof(int)>
para ser ainda mais corretoSim, eu sei que não "tenho" que fazer desta forma. Mas costumo escrever:
Por exemplo:
Entre outras coisas, esta abordagem:
Ex: #define ABS (X) (((X) <0)? - (X): (X))
ABS (i ++);
fonte
O que a resposta selecionada está fazendo está realmente errado. A função abaixo retornará a posição do bit ou 0 dependendo se o bit está realmente habilitado. Não era isso que o cartaz estava pedindo.
Aqui está o que o pôster estava procurando originalmente. A função abaixo retornará 1 ou 0 se o bit estiver habilitado e não a posição.
fonte
bool has_feature = CHECK_BIT(register, 25);
bom saber que eu poderia fazer isso sem a dupla negação.De acordo com esta descrição de campos de bits , existe um método para definir e acessar campos diretamente. O exemplo nesta entrada é:
Além disso, há um aviso lá:
fonte
Você pode usar um Bitset - http://www.cppreference.com/wiki/stl/bitset/start .
fonte
Use std :: bitset
fonte
temp
precisa ser refletido para torná-lo "big-endian"?Existe, a saber, a instrução intrínseca _bittest .
fonte
Eu uso isso:
onde "pos" é definido como 2 ^ n (ig 1,2,4,8,16,32 ...)
Retorna: 1 se verdadeiro 0 se falso
fonte
4 = 2^(3-1)
para a posição de bit 3, uma vez que era parte da questão.eu estava tentando ler um inteiro de 32 bits que definia os sinalizadores de um objeto em PDFs e isso não estava funcionando para mim
o que consertou foi mudar a definição:
o operando & retorna um inteiro com os sinalizadores que ambos têm em 1, e não estava convertendo corretamente em booleano, isso funcionou
fonte
!= 0
faria o mesmo. Não sei como as instruções de máquina geradas podem ser diferentes.Você pode "simular" mudança e mascaramento: if ((0x5e / (2 * 2 * 2))% 2) ...
fonte
Para a solução específica x86 de baixo nível, use o opcode x86 TEST .
Seu compilador deve transformar _bittest nisso ...
fonte
Por que não usar algo tão simples como isso?
SAÍDA: binário:
11111111
fonte
std::cout << (((status & (1 << i)) ? '1' : '0');
. Você deve usar aCHAR_BIT
constante de em<climits>
vez de codificar 8 bits, embora, neste caso, saiba que o resultado será 8 de qualquer maneira, já que está usando umuint8_t
se você quer apenas uma forma real de código:
observe que este depende de hw e assume esta ordem de bits 7654 3210 e var é de 8 bits.
Resulta em:
1 0 1 0
fonte
Embora seja muito tarde para responder agora, há uma maneira simples de descobrir se o enésimo bit está definido ou não, simplesmente usando os operadores matemáticos POWER e MODULUS.
Digamos que queremos saber se 'temp' tem o enésimo bit definido ou não. A seguinte expressão booleana fornecerá verdadeiro se o bit for definido, 0 caso contrário.
Considere o seguinte exemplo:
Se eu quiser saber se o terceiro bit está definido ou não, recebo
Portanto, a expressão retorna verdadeiro, indicando que o terceiro bit está definido.
fonte
Uma abordagem será verificar dentro da seguinte condição:
Um programa de explicação será:
Resultado:
fonte
pos - posição do bit começando de 0.
retorna 0 ou 1.
fonte
Eu faço isso:
LATGbits.LATG0 = ((m & 0x8)> 0); // para verificar se o bit-2 de m é 1
fonte
a maneira mais rápida parece ser uma tabela de pesquisa de máscaras
fonte