Tempo/Números

Operações bit a bit

AND/OR/XOR/NAND/NOR/XNOR/NOT e deslocamentos sobre números inteiros de uma largura definida (8/16/32/64 bits) em qualquer sistema numérico.

Bitwise operations work directly on a number's individual bits rather than its value as a whole — the basis for permission flags, network protocols, and low-level optimization.

How to use it

Common uses

Things to keep in mind

The result of NOT and shifts depends on the chosen bit width — the same number gives a different result at 8-bit versus 32-bit width because of the different number of bits involved.

XOR is often used to toggle a flag — applying XOR twice with the same value returns the original.

Artigo sobre esta ferramenta: Operações bit a bit: como AND, OR e XOR funcionam no nível dos bits

Perguntas frequentes

Qual a diferença entre AND, OR, XOR, NAND, NOR, XNOR e NOT?

AND dá 1 apenas quando ambos os bits são 1, OR dá 1 quando pelo menos um é 1, e XOR dá 1 quando os bits diferem. NAND/NOR/XNOR são suas negações, e NOT inverte cada bit de um único operando.

Como a largura de bits e o sinal de um número são tratados?

Escolha uma largura de 8/16/32/64 bits — operações e deslocamentos acontecem dentro desse intervalo. Números negativos são representados em complemento de dois, então o resultado de NOT ou um deslocamento pode parecer inesperado se você está acostumado com notação decimal.

Qual a diferença entre um deslocamento à esquerda e à direita?

Um deslocamento à esquerda (<<) adiciona zeros à direita, efetivamente multiplicando por 2 elevado à quantidade deslocada. Um deslocamento à direita pode ser lógico (adiciona zeros à esquerda) ou aritmético (preserva o bit de sinal) — o tipo depende do modo selecionado.

Por que uma expressão como "if (a & b == c)" geralmente não funciona como esperado?

Na maioria das linguagens, o operador de comparação == tem precedência maior que o operador bit a bit &, então a expressão é avaliada como "a & (b == c)", e não como o autor geralmente pretende. Para evitar essa armadilha, sempre coloque operações bit a bit entre parênteses explícitos.

Por que usar flags bit a bit em vez de variáveis booleanas separadas?

Um conjunto de flags empacotado em um único número é armazenado e transmitido de forma mais compacta (por exemplo, em protocolos de rede ou formatos de arquivo), e verificar ou alterar uma flag específica com AND/OR/XOR é uma única operação rápida.

Artigos: Tempo/Números

Tempo Unix: por que os computadores contam o tempo desde 1970

Por que 1º de janeiro de 1970 se tornou o ponto de referência do tempo para a maioria dos sistemas de computador.

Expressões cron: como decifrar um agendamento de tarefas

Como decifrar uma expressão como */15 * * * * e saber exatamente quando a tarefa será executada.

Sistemas numéricos: para que servem o binário, o octal e o hexadecimal

Por que a cor #FF5733 no CSS é escrita com dígitos hexadecimais em vez de decimais.

Diferença entre datas: por que contar dias é mais complicado do que parece

Por que subtrair datas de forma ingênua pode dar um resultado incorreto por causa dos anos bissextos.

Cálculo de idade: por que não é uma simples subtração de anos

Por que simplesmente subtrair os anos de nascimento pode dar uma idade um ano maior que a real.

Fusos horários: por que UTC não é a mesma coisa que GMT

Por que UTC nunca muda duas vezes ao ano, enquanto o horário de Londres (GMT/BST) muda.

Calculadora de duração: como somar corretamente horas, minutos e segundos

Por que ao somar minutos e segundos é preciso "transportar" o resto para a próxima casa, assim como na soma decimal.

ISO 8601 Duration: como escrever uma duração em formato padrão

Por que PT1H30M significa «1 hora 30 minutos», e não «1 minuto 30 horas».

Número da semana: por que países diferentes contam as semanas de forma diferente

Por que 1º de janeiro às vezes pertence à semana 52 ou 53 do ano anterior segundo o padrão ISO 8601.

Números romanos: como funciona um sistema sem zero nem posições

Por que IV significa 4 e não 6, e como funciona a regra de subtração nos números romanos.

IEEE 754: por que 0.1 + 0.2 não é igual a 0.3 no código

Por que em quase toda linguagem de programação 0.1 + 0.2 exibe 0.30000000000000004.

Número por extenso: para que transformar dígitos em palavras

Por que documentos bancários escrevem o valor tanto em dígitos quanto por extenso ao mesmo tempo.