Como posso definir todos os bits para '1' em um número binário de um tamanho desconhecido?
-
03-07-2019 - |
Pergunta
Eu estou tentando escrever uma função em assembly (mas vamos supor agnóstico idioma para a questão).
Como posso usar operadores bit a bit para definir todos os bits de um passado em número para 1?
Eu sei que eu posso usar o bit a bit "ou" com uma máscara com os bits Desejo set, mas eu não sei como construir uma máscara baseada fora de algum um número binário de tamanho N.
Solução
~ (x & 0)
x e 0 será sempre resultar em 0, e ~ vai virar todos os bits de 1s.
Outras dicas
Set-lo a 0, em seguida, virar todos os bits a 1 com um bit a bit-NOT.
Você vai descobrir que, em linguagem assembly que você Have para saber o tamanho de um "passado em número". E em linguagem assembly que realmente importa qual máquina a linguagem assembly é para.
Dado que a informação, você deve estar se perguntando tanto
- Como faço para definir um registo inteiro para todos os bits 1?
ou
- Como faço para preencher uma região na memória com todos os bits 1?
Para preencher um cadastro com todos os bits 1, na maioria das máquinas a maneira eficiente leva duas instruções:
-
Limpar o registo, utilizando uma instrução especial-propósito claro, ou carregar imediato 0, ou xor registo com ele mesmo.
-
Leve o complemento bit a bit do registo.
Enchimento de memória com 1 bits requer então 1 ou mais instruções de loja ...
Você vai encontrar dicas muito mais-girando bits e truques no maravilhoso livro de Hank Warren do Hacker Delight .
Set x 1
Enquanto x Resposta = número ou x -. 1 O código assume sua entrada é chamado de "número". Ele deve funcionar bem para valores positivos. Nota para valores negativos que são complemento de dois a tentativa operação não faz sentido como o alto bit será sempre um.
Set-lo para -1
. Isso geralmente é representado por todos os bits sendo 1.
Use T(~T(0))
.
Onde T
é o typename (se estamos falando de C ++.)
Isso evita que a promoção indesejada para int
se o tipo é menor do que int
.