Como posso definir todos os bits para '1' em um número binário de um tamanho desconhecido?

StackOverflow https://stackoverflow.com/questions/818535

  •  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.

Foi útil?

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:

  1. Limpar o registo, utilizando uma instrução especial-propósito claro, ou carregar imediato 0, ou xor registo com ele mesmo.

  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top