🧰 ToolPicoTodas as ferramentas →

Início > Blog > Operações bit a bit e largura de bits

Operações bit a bit e largura de bits: os erros mais comuns de quem está a começar a programar

Se já viste código com &, |, ^ ou << e ficaste na dúvida sobre o que faziam, ou se um deslocamento de bits te deu um resultado que não batia certo com a conta "vezes 2" que esperavas, este guia explica as operações bit a bit, as armadilhas de largura de bits fixa, e como testar tudo isto sem escrever uma linha de código.

Nesta página

O que fazem AND, OR, XOR e NOT, na prática?

Resposta curtaAND devolve 1 só quando ambos os bits são 1; OR devolve 1 quando pelo menos um dos bits é 1; XOR devolve 1 quando os bits são diferentes; NOT simplesmente inverte cada bit (0↔1). Estas operações trabalham bit a bit, comparando as duas sequências binárias posição por posição.

Estas quatro operações são a base de quase tudo o que um processador faz com números — desde testar permissões até comprimir dados. Um cenário comum, hipotético, é este: um sistema de permissões guarda três "flags" (ler, escrever, executar) num único número, cada uma associada a um bit. Para verificar se a flag de "escrever" está ativa, usa-se AND com uma máscara que tem apenas esse bit a 1; o resultado só será diferente de zero se a flag estiver realmente ligada.

Exemplo (ilustrativo) 1010 AND 0110 = 0010 · 1010 OR 0110 = 1110 · 1010 XOR 0110 = 1100 · NOT 1010 (em 4 bits) = 0101

No separador "Bits clicáveis" do conversor de base numérica, o painel de operações bit a bit calcula estes quatro resultados (mais os deslocamentos) para dois valores decimais à tua escolha, mostrando a grelha de bits resultante em tempo real — útil para confirmar o resultado de uma máscara antes de a usares num programa.

Deslocamentos de bits: porque é que "vezes 2" às vezes não bate certo

Resposta curtaUm deslocamento à esquerda (<<) move todos os bits uma posição para a esquerda, o que equivale matematicamente a multiplicar por 2 (por posição deslocada); um deslocamento à direita (>>) equivale a dividir por 2, descartando o resto. O resultado só corresponde à conta esperada se couber na largura de bits definida.

Um erro frequente de quem está a aprender é assumir que um deslocamento à esquerda "sempre" duplica o valor exato, esquecendo que a largura de bits é fixa. Por exemplo (hipotético): num registo de 8 bits, o valor 200 deslocado uma posição à esquerda deveria "matematicamente" dar 400 — mas 400 não cabe em 8 bits (o máximo sem sinal é 255), por isso o bit que ultrapassa a largura é descartado, e o resultado real é diferente do esperado. Isto chama-se overflow, e é uma das causas mais comuns de bugs subtis em código que manipula bits diretamente.

Nota: os valores acima (200, 400) são apenas um exemplo didático de overflow, não uma medição de nenhum sistema real.

Largura de bits fixa: quanto cabe em 8, 16, 32 ou 64 bits?

Resposta curtaSem sinal, uma largura de n bits vai de 0 a 2ⁿ-1. Com sinal (complemento de dois), o intervalo desloca-se para incluir metade de valores negativos. Escolher a largura errada para o teu caso de uso é uma causa comum de resultados "estranhos" ao testar código de baixo nível.

Intervalos de valores por largura de bits
LarguraSem sinal (mín–máx)Com sinal (mín–máx)
8 bits0 – 255-128 – 127
16 bits0 – 65 535-32 768 – 32 767
32 bits0 – 4 294 967 295-2 147 483 648 – 2 147 483 647
64 bits0 – 18 446 744 073 709 551 615~-9,22×10¹⁸ – ~9,22×10¹⁸

É por isto que o separador "Bits clicáveis" do conversor deixa escolher a largura (8/16/32/64 bits) antes de mostrar o valor sem sinal e o valor com sinal (complemento de dois): o mesmo padrão de bits pode representar números completamente diferentes consoante a largura e a interpretação escolhidas. Testar isto na ferramenta, com o teu próprio número, é mais fiável do que fazer a conta de cabeça.

Como converter texto em código ASCII/byte (e voltar atrás)?

Resposta curtaCada carácter tem um código numérico associado (ASCII para letras/números/pontuação básica em inglês, ou um ponto de código Unicode mais amplo para acentos e outros símbolos). Converter texto em código traduz cada carácter para esse número, na base escolhida; converter código em texto faz o percurso inverso.

Este processo é a base de como qualquer ficheiro de texto é guardado em disco: não existem "letras" dentro de um computador, apenas números interpretados como letras segundo uma tabela de correspondência. No separador "Texto ↔ Bytes" do conversor, é possível escrever uma palavra e ver imediatamente os códigos correspondentes em decimal, hexadecimal ou qualquer outra base, ou fazer o percurso inverso — colar uma sequência de códigos separados por espaços e obter o texto de volta.

Cenário hipotético e prático: um estudante de informática que precisa de confirmar, para um exercício, qual é o código decimal ou hexadecimal de um conjunto de caracteres pode usar este separador em vez de consultar uma tabela ASCII impressa.

Testa as operações bit a bit, os deslocamentos, a largura de bits e a conversão texto ↔ código diretamente na ferramenta gratuita do ToolPico.

Experimentar a ferramenta →

Perguntas frequentes

O que faz o operador XOR e para que serve na prática?
XOR (OU exclusivo) devolve 1 quando os dois bits comparados são diferentes, e 0 quando são iguais. É usado para inverter bits específicos com uma máscara, detetar diferenças entre dois valores binários, e em algumas técnicas simples de codificação/checksum. Por exemplo, 1010 XOR 0110 = 1100.
Porque é que um deslocamento de bits (shift) pode dar um resultado inesperado?
Um deslocamento à esquerda (<<) equivale a multiplicar por 2 para cada posição deslocada, e à direita (>>) a dividir por 2 (arredondando para baixo). O resultado só é o esperado se o valor final couber na largura de bits definida (8/16/32/64); se ultrapassar essa largura, os bits mais à esquerda são descartados (overflow), o que dá um valor diferente do multiplicado matematicamente.
O que é uma máscara de bits (bitmask) e como se usa com AND?
Uma máscara de bits é um valor binário usado com a operação AND para "isolar" ou testar bits específicos de outro número, mantendo apenas os bits onde a máscara tem 1 e zerando os restantes. Por exemplo, para verificar se o bit menos significativo de um valor está ligado (útil para testar se um número é par ou ímpar), usa-se AND com a máscara 0001 (1 em decimal).
Como se converte texto para código ASCII/byte e vice-versa?
Cada carácter de texto corresponde a um código numérico (ASCII para caracteres latinos básicos, ou um ponto de código Unicode mais amplo para acentos e outros símbolos). Para converter texto em código, cada carácter é traduzido para o seu valor numérico na base escolhida (por ex. decimal ou hexadecimal); para o sentido inverso, cada código é traduzido de volta ao carácter correspondente.
Qual é o valor máximo que cabe numa largura de 8, 16 ou 32 bits?
Sem sinal, uma largura de n bits representa valores de 0 a 2ⁿ-1: 8 bits vai até 255, 16 bits até 65535, e 32 bits até 4294967295. Com sinal (complemento de dois), o intervalo desloca-se para incluir valores negativos, por exemplo 8 bits com sinal vai de -128 a 127.
Nota metodológica: Este artigo é apenas informativo e explica conceitos gerais de lógica binária, operações bit a bit e representação numérica em computadores. Os exemplos numéricos e cenários apresentados são ilustrativos/hipotéticos. Para cálculos exatos com os teus próprios valores, usa a ferramenta gratuita ligada acima.