Calculadora bit a bit
Realize operações bitwise em inteiros e veja os resultados em decimal, hexadecimal e binário.
Como funciona
- Digite dois números: insira os valores a operar, em decimal, binário (prefixo 0b) ou hexadecimal (prefixo 0x).
- Escolha a operação: selecione AND, OR, XOR, NOT, deslocamento à esquerda (<<) ou deslocamento à direita (>>).
- Veja o resultado: a saída exibe o resultado em decimal, binário e hexadecimal ao mesmo tempo, com uma visualização dos bits.
Por que usar a calculadora bitwise?
Operações bitwise são fundamentais em programação de sistemas, criptografia, desenvolvimento de jogos, gráficos, rede e sistemas embarcados.
Funcionalidades
- Todos os operadores bitwise: AND (&), OR (|), XOR (^), NOT (~), deslocamento à esquerda (<<) e à direita (>>).
- Entrada multi-base: digite números em decimal, binário (0b…) ou hexadecimal (0x…).
- Saída multi-base: os resultados são exibidos simultaneamente em decimal, binário e hexadecimal.
- Visualização dos bits: uma grade visual mostra quais bits estão ativados para cada operando e para o resultado.
- Modos com/sem sinal: alterne entre inteiros de 8, 16, 32 e 64 bits.
Perguntas frequentes
Para que serve XOR em programação?
XOR (^) serve para inverter bits, criptografia/ofuscação simples, trocar variáveis sem variável temporária, verificar paridade e somas de verificação.
Qual é a diferença entre << e >>?
O deslocamento à esquerda (<<) move todos os bits para a esquerda, equivalente a uma multiplicação por potências de 2. O deslocamento à direita (>>) move para a direita, equivalente a divisão.
Como ativar ou desativar um bit específico?
Para ativar o bit n: value |= (1 << n). Para desativar o bit n: value &= ~(1 << n). Para inverter o bit n: value ^= (1 << n). Para verificar o bit n: (value >> n) & 1.
Da álgebra booleana ao silício: como as operações bit a bit se tornaram universais
As operações bit a bit que toda CPU moderna implementa vêm de dois artigos fundadores publicados com mais de 80 anos de diferença. Em 1854, George Boole publicou «An Investigation of the Laws of Thought», definindo a álgebra da lógica de dois valores, AND, OR, NOT e suas identidades. Era um trabalho filosófico, não de engenharia. Então em 1937, um estudante de mestrado do MIT de 21 anos chamado Claude Shannon escreveu sua tese de mestrado «A Symbolic Analysis of Relay and Switching Circuits», provando que a álgebra booleana podia descrever circuitos elétricos de relés e portanto que qualquer computação lógica podia ser fisicamente implementada. Esta tese é amplamente citada como a tese de mestrado mais importante do século XX e é a base de toda eletrônica digital. O complemento de dois, a representação binária para números negativos que toda CPU usa, foi patenteado em 1962 pela Burroughs Corporation mas já havia sido usado no IBM 704 (1954) e outras máquinas antigas. IEEE 754 padronizou a representação de ponto flutuante em 1985, fixando o layout de bits que cada Number JavaScript ainda usa, 1 bit de sinal, 11 expoente, 52 mantissa para binary64. Hoje, os operadores da linguagem C & | ^ ~ << >> mapeiam quase diretamente para instruções únicas de CPU, razão pela qual o código bit a bit pode ser dramaticamente mais rápido que o equivalente aritmético.
Os seis operadores, o que fazem em nível de bit
- AND (
&). O bit resultado é 1 apenas se ambos os bits de entrada forem 1.0b1100 & 0b1010 = 0b1000. Use para mascarar, isolar bits específicos, ou verificar se uma flag está ativa:flags & FLAG_READé não-zero sseFLAG_READestá ligada. - OR (
|). O bit resultado é 1 se qualquer um dos bits de entrada for 1.0b1100 | 0b1010 = 0b1110. Use para definir bits, combinar flags:flags = FLAG_READ | FLAG_WRITE. - XOR (
^). O bit resultado é 1 se exatamente um bit de entrada for 1.0b1100 ^ 0b1010 = 0b0110. Use para alternar bits, ofuscação simples (x ^ x = 0, então XOR é seu próprio inverso), paridade e mistura de hash. - NOT (
~). Inverte cada bit.~0b0000_1111 = 0b1111_0000(em 8 bits). Em complemento de dois,~xequivale a-x − 1, então~5 === -6em JavaScript. - Deslocamento à esquerda (
<<). Mover todos os bits para a esquerda em n posições, preencher a direita com zeros.1 << 3 === 8, equivalente a multiplicar por 2³. Útil para construir máscaras de bits:1 << né «o bit na posição n». - Deslocamento à direita (
>>aritmético,>>>lógico). Mover bits para a direita. O deslocamento aritmético (>>em JS, Java, C com sinal) preserva o bit de sinal; o deslocamento lógico (>>>em JS,>>em C sem sinal) preenche com zeros.-8 >> 1 === -4mas-8 >>> 1 === 2147483644em JavaScript porque>>>coage para int sem sinal de 32 bits primeiro.
Onde o bit a bit realmente ganha seu sustento
- Flags de bits e alternâncias de recursos. Empacote 32 opções booleanas em um único inteiro. Permissões de arquivos Linux (
chmod 755), cabeçalhos de protocolos de rede (TCP, IPv4), e flags de estado OpenGL todas usam este padrão. Uma verificação&te diz se um recurso está habilitado. - Permissões de arquivos Unix.
rwxr-xr-xé0b111_101_101 = 0o755 = 493. Os três grupos são usuário/grupo/outro, cada três bits são read/write/execute. A calculadora chmod transforma a forma simbólica no inteiro que seu shell quer. - Máscaras de sub-rede IP. Uma máscara
/24é255.255.255.0ou0xFFFFFF00. Para verificar se um IP está em uma sub-rede:(ip & mask) === (network & mask). Usado por todo roteador e firewall do mundo. - Criptografia e hashing. SHA-256, AES, ChaCha20, BLAKE3, cada hash e cifra moderno é construído principalmente a partir de AND, OR, XOR, NOT e rotações. XOR sozinho é a base dos blocos de uso único, que são comprovadamente inquebráveis quando a chave é verdadeiramente aleatória e usada uma vez.
- Manipulação de cores. Uma cor RGBA de 32 bits empacota quatro canais de 8 bits:
(R << 24) | (G << 16) | (B << 8) | A. Para extrair o canal vermelho:(color >> 24) & 0xFF. Usado por HTML canvas, OpenGL, todo formato de imagem. - Truques de desempenho.
x & 1é muito mais rápido quex % 2na maioria das CPUs (um ciclo vs ~10).x >> 1divide por 2 em um ciclo. Alinhamento de potência de dois, contagens de população de bits, e hacks de manipulação de bits estão por toda parte em código crítico em desempenho. (Veja a página «Bit Twiddling Hacks» de Sean Anderson para um catálogo famoso.) - Sistemas embarcados. Microcontroladores mapeiam registradores de hardware para posições de bits específicas na memória. Configurar um UART ou um pino GPIO requer mascarar e deslocar para ler ou escrever os bits corretos sem perturbar o resto. A sintaxe bitfield de C é açúcar conveniente para esses padrões.
Erros que mordem
- Confundir
&com&&e|com||. As formas simples são bit a bit, as duplas são lógicas de curto-circuito.1 & 2 === 0(sem bits compartilhados) mas1 && 2 === 2(ambos verdadeiros, retorna o segundo). Confundi-las quebra silenciosamente a lógica condicional. - Surpresas de precedência de operadores.
x & FLAG === 0significax & (FLAG === 0), não(x & FLAG) === 0, porque===se liga mais firmemente que&. Sempre parentesa expressões bit a bit em condições. - Confusão de deslocamento com sinal vs sem sinal. Em JavaScript,
>>é aritmético (extensão de sinal),>>>é lógico (preenchimento com zero). C distingue pelo tipo da variável, tipos com sinal usam aritmético, sem sinal usam lógico. Java tem tanto>>quanto>>>como JavaScript. Não combinar com a convenção da linguagem inverte silenciosamente o significado. - JavaScript trunca para 32 bits em operações bit a bit. Apesar de
Numberser um float de 64 bits, todos os operadores bit a bit coagem operandos para int32 primeiro.0x100000000 & 0xFF === 0, não 0 + o byte baixo, porque o operando é truncado para 32 bits antes do AND. Para manipulação de bits de 64 bits useBigInt, que tem seus próprios operadores bit a bit. - Deslocar por > 31 em JavaScript.
1 << 32 === 1, não 0. A quantidade de deslocamento é tomada módulo 32. C é ainda mais perigoso: deslocar por mais que a largura do bit é comportamento indefinido, então compiladores podem fazer qualquer coisa. Sempre verifiquen < bitWidthantes de deslocar por um valor em tempo de execução. - Endianness em código de empacotamento de bytes.
(r << 24) | (g << 16) | (b << 8) | aproduz0xRRGGBBAA. Se os bytes são armazenados nessa ordem ou invertidos na memória depende da plataforma. ImageData em HTML canvas é little-endian em x86; o formato de arquivo PNG é big-endian. Converta explicitamente comDataViewao ler formatos binários. - Esquecer o complemento de dois.
~0 === -1, não0xFFFFFFFF, porque todos-uns é a codificação em complemento de dois de −1. Para obter a interpretação 32 bits sem sinal em JavaScript:(~0) >>> 0 === 4294967295.
Por que complemento de dois, e o que significa em nível de bit
Toda CPU moderna representa inteiros negativos usando complemento de dois. Em um byte com sinal de 8 bits, os valores 0 a 127 são codificados como binário 0000_0000 a 0111_1111. Então −1 é codificado como 1111_1111, −2 como 1111_1110, até −128 como 1000_0000. A razão: com essa codificação, a adição funciona da mesma forma se as entradas são com sinal ou sem sinal, a CPU não precisa de instruções add-com-sinal e add-sem-sinal separadas. A assimetria é que o intervalo negativo é um maior que o positivo (em 8 bits, −128 a +127), razão pela qual Math.abs(INT_MIN) transborda em toda linguagem com inteiros de largura fixa. As codificações mais antigas sinal-magnitude (um bit para o sinal, resto para magnitude) e complemento de um existiram nos anos 1950-60 mas perderam para o complemento de dois porque tinham duas representações de zero e exigiam hardware de caso especial para negação.
Mais perguntas frequentes
Por que ~5 é igual a -6 em vez de 250?
Porque em complemento de dois (a codificação que toda CPU moderna usa), virar cada bit de um número positivo te dá -n - 1. Então ~5 === -6 e ~0 === -1. Em um contexto sem sinal de 8 bits, o mesmo padrão de bits que ~5 (binário 1111_1010) representaria 250. JavaScript trata o resultado como sinal 32 bits, então você vê -6. Para obter a interpretação sem sinal: (~5) >>> 0 em 32 bits, que dá 4294967290, ou mascarar a 8 bits com ~5 & 0xFF que dá 250.
XOR é realmente uma criptografia?
XOR é o bloco de construção de cada cifra simétrica moderna, mas XOR sozinho não é criptografia segura. Um bloco de uso único, XOR com uma chave verdadeiramente aleatória tão longa quanto a mensagem, usada exatamente uma vez, é teoricamente da informação inquebrável (Shannon, 1949). Reutilize a chave, ou use uma chave mais curta que a mensagem, e a análise de frequência a quebra trivialmente. Cifras reais como AES usam XOR mais difusão e substituição para amplificar uma chave curta em um fluxo de bytes pseudo-aleatórios que parecem um bloco de uso único para qualquer um sem a chave. Então «criptografar com XOR» é bom apenas para ofuscação trivial, nunca para segredos reais.
Quando devo usar BigInt em vez de Number para manipulação de bits?
Sempre que precisar de mais de 32 bits de precisão bit a bit. Os operadores bit a bit JavaScript truncam operandos Number para inteiros com sinal de 32 bits antes de computar. Se você precisa de máscaras de 64 bits (e.g. manipular um conjunto de flags de recursos de 64 bits, trabalhar com offsets mmap Linux, ou implementar SHA-512), use BigInt: 0xFFFFFFFFFFFFFFFFn & 0xFFn === 255n. BigInt é mais lento que Number, ~3-10× dependendo da operação, então reserve para os casos onde 32 bits são genuinamente poucos.
Como conto o número de bits 1 em um número?
Isto é a contagem de população ou peso de Hamming. A maioria das CPUs modernas tem uma única instrução para isso (POPCNT em x86, VCNT em ARM). Em JavaScript, não há nativo, então use o clássico de manipulação de bits: let c = 0; while (x) { c += x & 1; x >>>= 1; }. Ou o truque SWAR paralelo de Hacker's Delight: x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0F0F0F0F; return (x * 0x01010101) >>> 24;, que conta os bits em um inteiro de 32 bits em aproximadamente uma dúzia de ciclos.
Meus dados são enviados a algum lugar quando uso esta calculadora?
Não. Cada operação executa no motor JavaScript do seu navegador, nenhuma chamada de rede acontece durante um cálculo. Abra a aba Rede no DevTools e clique Calcular, você verá zero requisições de saída. Seguro para máscaras sensíveis, chaves, ou trabalho de layout de bits proprietário.