Eu sou alguém que escreve código apenas por diversão e que realmente não se aprofundou nele em ambientes acadêmicos ou profissionais; portanto, coisas como esses operadores bit a bit realmente me escapam.
Eu estava lendo um artigo sobre JavaScript, que aparentemente suporta operações bit a bit. Continuo vendo essa operação mencionada em alguns lugares e tentei ler para descobrir exatamente o que é, mas simplesmente não entendi nada. Então, o que são eles? Exemplos claros seriam ótimos! : D
Apenas mais algumas perguntas - quais são algumas aplicações práticas de operações bit a bit? Quando você pode usá-los?
Respostas:
Como ninguém abordou o assunto de por que eles são úteis:
Uso muito operações bit a bit ao trabalhar com sinalizadores. Por exemplo, se você quiser passar uma série de sinalizadores para uma operação (por exemplo
File.Open()
, com o modo de Leitura e o modo de Gravação ambos ativados), poderá transmiti-los como um valor único. Isso é feito atribuindo a cada sinalizador possível seu próprio bit em um conjunto de bits (byte, short, int ou long). Por exemplo:Portanto, se você deseja passar para ler e escrever, você passaria (READ | WRITE) que combina os dois em
Que então pode ser descriptografado na outra extremidade, como:
que verifica
que retorna
que não é 0, portanto, o sinalizador especifica READ.
Você pode usar o XOR para alternar vários bits. Eu usei isso ao usar um sinalizador para especificar entradas direcionais (Cima, Baixo, Esquerda, Direita). Por exemplo, se um sprite está se movendo horizontalmente, e eu quero que ele gire:
Simplesmente XOR o valor atual com (ESQUERDA | DIREITA) que desativará ESQUERDA e DIREITA, neste caso.
A troca de bits é útil em vários casos.
é o mesmo que
se você precisar multiplicar rapidamente por uma potência de dois, mas esteja atento para mudar um bit para o bit superior - isso torna o número negativo, a menos que não seja assinado. Também é útil ao lidar com diferentes tamanhos de dados. Por exemplo, lendo um número inteiro de quatro bytes:
Supondo que A seja o byte mais significativo e D seja o menos. Terminaria como:
As cores geralmente são armazenadas dessa maneira (com o byte mais significativo ignorado ou usado como Alpha):
Para encontrar os valores novamente, basta mudar os bits para a direita até que estejam na parte inferior e depois mascarar os bits restantes de ordem superior:
0xFF
é o mesmo que11111111
. Então, essencialmente, para Red, você faria o seguinte:fonte
Vale a pena notar que as tabelas verdadeiras de um bit listadas como outras respostas funcionam apenas em um ou dois bits de entrada por vez. O que acontece quando você usa números inteiros, como:
A resposta está na expansão binária de cada entrada:
Cada par de bits em cada coluna é executado através da função "AND" para fornecer o bit de saída correspondente na linha inferior. Portanto, a resposta para a expressão acima é 4. A CPU realizou (neste exemplo) 8 operações "AND" separadas em paralelo, uma para cada coluna.
Menciono isso porque ainda me lembro de ter esse "AHA!" momento em que aprendi sobre isso há muitos anos.
fonte
Operadores bit a bit são operadores que trabalham um pouco de cada vez.
AND é 1 apenas se as duas entradas forem 1.
OR é 1 se uma ou mais de suas entradas forem 1.
XOR é 1 apenas se exatamente uma de suas entradas for 1.
NOT é 1 somente se sua entrada for 0.
Estes podem ser melhor descritos como tabelas de verdade. As possibilidades de entradas estão na parte superior e esquerda, o bit resultante é um dos quatro valores (dois no caso de NOT, pois possui apenas uma entrada) mostrados na interseção das duas entradas.
Um exemplo é se você deseja apenas os 4 bits inferiores de um número inteiro, E AND com 15 (binário 1111), para:
fonte
Estes são os operadores bit a bit, todos suportados em JavaScript:
op1 & op2
- OAND
operador compara dois bits e gera um resultado de 1 se os dois bits forem 1; caso contrário, ele retornará 0.op1 | op2
- OOR
operador compara dois bits e gera um resultado de 1 se os bits forem complementares; caso contrário, ele retornará 0.op1 ^ op2
- OEXCLUSIVE-OR
operador compara dois bits e retorna 1 se um dos bits for 1 e fornece 0 se os dois bits forem 0 ou 1.~op1
- OCOMPLEMENT
operador é usado para inverter todos os bits do operando.op1 << op2
- OSHIFT LEFT
operador move os bits para a esquerda, descarta o bit da extrema esquerda e atribui ao bit mais à direita o valor 0. Cada movimento para a esquerda multiplica efetivamente op1 por 2.op1 >> op2
- OSHIFT RIGHT
operador move os bits para a direita, descarta o bit da extrema direita e atribui ao bit mais à esquerda o valor 0. Cada movimento para a direita divide efetivamente o op1 pela metade. O bit de sinal mais à esquerda é preservado.op1 >>> op2
- O operadorSHIFT RIGHT
-ZERO FILL
move os bits para a direita, descarta o bit da extrema direita e atribui ao bit mais à esquerda o valor 0. Cada movimento para a direita divide efetivamente op1 pela metade. O bit de sinal mais à esquerda é descartado.fonte
1 | 1
dá1
e não0
, e como|
é que então deve ser diferente^
. Eu tive que usar essa pergunta / pergunta como alvo duplicado há alguns dias e desejei que, após 10 anos, houvesse uma duplicata canônica mais clara para esse tipo de perguntas.Para resumir um pouco mais, isso tem muito a ver com a representação binária do valor em questão.
Espero que isto ajude.
fonte
|
é uma operação OR?x | y = 1000 0001 |
parteQuando o termo "bit a bit" é mencionado, algumas vezes é esclarecido que esse não é um operador "lógico".
Por exemplo, em JavaScript, os operadores bit a bit tratam seus operandos como uma sequência de 32 bits (zeros e uns) ; enquanto isso, operadores lógicos são normalmente usados com valores booleanos (lógicos), mas podem funcionar com tipos não-booleanos.
Veja expr1 && expr2, por exemplo.
Como outros observaram, 2 e 4 são AND bit a bit, portanto retornará 0.
Você pode copiar o seguinte para test.html ou algo assim e testar:
fonte
operações :
AND bit a bit
OR bit a bit
NÃO bit a bit
XOR bit a bit
etc
Item da lista
Por exemplo.
Usos do operador bit a bit
Por exemplo.
Por exemplo.
if else
instruçãoPor exemplo.
Por exemplo.
a mudança bit a bit funciona apenas com o número + ve
Também existe uma ampla variedade de uso da lógica bit a bit
fonte
The left-shift and right-shift operators are equivalent to multiplication and division by x * 2y respectively.
Está certo! muyiy.cn/question/program/102.htmlPode ajudar a pensar dessa maneira. É assim que AND (&) funciona:
Basicamente, diz que são esses dois números, então, se você tiver dois números 5 e 3, eles serão convertidos em binários e o computador pensará
são ambos um: 00000001 0 é falso, 1 é verdadeiro
Portanto, o AND de 5 e 3 é um. O operador OR (|) faz a mesma coisa, exceto que apenas um dos números deve ser um para gerar 1, não os dois.
fonte
Fiquei ouvindo sobre como os operadores de bits em JavaScript eram lentos. Fiz alguns testes para o meu último post no blog e descobri que eles eram 40% a 80% mais rápidos que a alternativa aritmética em vários testes. Talvez eles costumavam ser lentos. Nos navegadores modernos, eu os amo.
Eu tenho um caso no meu código que será mais rápido e fácil de ler por causa disso. Vou manter meus olhos abertos para mais.
fonte