OR bit a bit para diminuir decimais

var test = 5.5;
0|test; // 5

Já vi o uso da ~operação bit a bit para retirar decimais de um número. A razão de ele funcionar é porque o uso de operações bit a bit converte um número em um inteiro de 32 bits com sinal. Usar o NOT bit a bit ~duas vezes fará o seguinte:

  • converter o número atual em um inteiro com sinal.
  • executa a operação NOT, que converte todos os bits 0 em 1s e 1s em 0.
  • executa a operação NOT (novamente), retornando o número ao seu estado anterior.

Embora isso seja legal e tudo, usar a operação bit a bit OR 0|compara dois números e cria um novo número em que um dos bits é 1. Então, fazer 0|testo seguinte:

  • converte o teste em um inteiro assinado
  • executa a operação OR, que irá:
    • verifique os 1s no 0 (que, não há nenhum)
    • verifique se há 1s em test
  • Retorna a versão inteira assinada do teste (já que 0 tem 0 1s)

Não fiz nenhum teste de desempenho nisso … mas fundamentalmente parece melhor fazer isso do que virar e inverter todos os 1s e 0s.

Alguns documentos bitops aqui


Com tudo isso dito, por favor, não faça isso. 🙂 É super ilegível, e você tem a possibilidade de perder informações se o número for maior que 2 ^ 32.