Quero extrair bits de um número decimal.
Por exemplo, 7 é o binário 0111 e quero obter 0 1 1 1 todos os bits armazenados em bool. Como posso fazer isso?
OK, um loop não é uma boa opção, posso fazer outra coisa para isso?
c
bit-manipulation
Badr
fonte
fonte
(n >> k) & 1
é igualmente válido e não requer o cálculo da máscara, pois a máscara é constante devido ao deslocamento antes da máscara em vez do contrário.struct
pode ser útil, pois você obtém todos os dados necessários com uma única operação.Conforme solicitado, decidi estender meu comentário sobre a resposta do indicador a uma resposta completa. Embora sua resposta esteja correta, é desnecessariamente complexa. Além disso, todas as respostas atuais usam
int
s com sinais para representar os valores. Isso é perigoso, pois o deslocamento para a direita de valores negativos é definido pela implementação (ou seja, não é portátil) e o deslocamento para a esquerda pode levar a um comportamento indefinido (consulte esta pergunta ).Deslocando para a direita o bit desejado para a posição de bit menos significativa, o mascaramento pode ser feito
1
. Não há necessidade de calcular um novo valor de máscara para cada bit.Como um programa completo, computando (e subsequentemente imprimindo) uma matriz de valores de bit único:
Supondo que você deseja calcular todos os bits como neste caso, e não um específico, o loop pode ser alterado para
Isso é modificado
input
no local e, portanto, permite o uso de uma largura constante, deslocamento de um único bit, que pode ser mais eficiente em algumas arquiteturas.fonte
Esta é uma maneira de fazer isso - existem muitas outras:
É difícil entender por que o uso de um loop não é desejado, mas é fácil desenrolá-lo:
Ou avaliando expressões constantes nas últimas quatro declarações:
fonte
Esta é uma maneira muito simples de fazer isso;
fonte
@prateek obrigado por sua ajuda. Reescrevi a função com comentários para uso em um programa. Aumente 8 para mais bits (até 32 para um inteiro).
fonte
Se você não quiser nenhum laço, terá que escrevê-lo:
Conforme demonstrado aqui, isso também funciona em um inicializador.
fonte
fonte
Usando
std::bitset
fonte