Operadores bit a bit e operadores de deslocamento em Dart

Manipula cada bit individual da representação binária dos números, só funciona com números inteiros

Tabela de operadores bit a bit e operadores de deslocamento

OperadorNomeRegra de cálculo
&AND bit a bitO bit resultado só vale 1 quando os bits binários correspondentes forem ambos 1, caso contrário vale 0
|OR bit a bitO bit resultado vale 1 se qualquer um dos bits binários correspondentes for 1, senão vale 0
^XOR bit a bit (OU exclusivo)O bit resultado vale 1 quando os bits binários correspondentes forem diferentes, se forem iguais vale 0
~exprNegação bit a bit (operador unário)Inverte todos os bits binários: 0 ↔ 1, 0 vira 1 e 1 vira 0
<<Deslocamento à esquerda Shift leftToda a sequência binária é deslocada N posições para a esquerda, completando com zeros no lado direito
>>Deslocamento à direita com sinal Shift rightA sequência binária é movida N posições para a direita, completando no lado esquerdo com o bit de sinal (0 para números positivos, 1 para negativos)
>>>Deslocamento à direita sem sinal Unsigned shift rightA sequência binária é deslocada N posições para a direita, sempre completando com zeros à esquerda; números negativos são convertidos primeiro para inteiro de 32 bits sem sinal antes do deslocamento

Operador AND bit a bit (&)

O bit resultado é 1 apenas se os dois bits correspondentes forem 1; se qualquer um for 0, o bit resultado será 0.

Bit do primeiro númeroBit do segundo númeroResultado da operação
111
100
010
000

Exemplo

void main() {
  // Validação de bit único
  assert((1 & 1) == 1);
  assert((1 & 0) == 0);
  assert((0 & 1) == 0);
  assert((0 & 0) == 0);

  // Exemplo com inteiro multi-bit
  final a = 0x22; // Binário 00100010
  final b = 0x0f; // Binário 00001111
  assert((a & b) == 0x02); // Resultado 00000010
}Code language: PHP (php)

Operador OR bit a bit (|)

O bit resultado vale 1 se qualquer um dos dois bits correspondentes for 1; só será 0 se ambos forem 0.

Bit do primeiro númeroBit do segundo númeroResultado da operação
111
101
011
000
void main() {
  // Validação de bit único
  assert((1 | 1) == 1);
  assert((1 | 0) == 1);
  assert((0 | 1) == 1);
  assert((0 | 0) == 0);

  // Exemplo com inteiro multi-bit
  final a = 0x22; // Binário 00100010
  final b = 0x0f; // Binário 00001111
  assert((a | b) == 0x2f); // Resultado 00101111
}Code language: PHP (php)

Operador XOR bit a bit (^)

O bit resultado vale 1 quando os dois bits correspondentes têm valores diferentes; se forem iguais o resultado é 0.

Bit do primeiro númeroBit do segundo númeroResultado da operação
110
101
011
000

Exemplo

void main() {
  // Validação de bit único
  assert((1 ^ 1) == 0);
  assert((1 ^ 0) == 1);
  assert((0 ^ 1) == 1);
  assert((0 ^ 0) == 0);

  // Exemplo com inteiro multi-bit
  final a = 0x22; // Binário 00100010
  final b = 0x0f; // Binário 00001111
  assert((a ^ b) == 0x2d); // Resultado 00101101
}Code language: PHP (php)

Operador de negação bit a bit (~)

Operador unário, precisa apenas de um operando, inverte cada bit binário individualmente: 0 vira 1 e 1 vira 0.

Bit originalBit invertido
10
01

Exemplo

void main() {
  // Validação de bit único
  assert((~1 & 1) == 0);
  assert((~0 & 1) == 1);

  // Exemplo com inteiro multi-bit
  final a = 0x22; // Binário 00100010
  final mask = 0x0f; // Binário 00001111
  assert((a & ~mask) == 0x20); // Inverte mask e faz AND com a, limpa os 4 bits menos significativos
}Code language: PHP (php)

Veja um exemplo completo

void main() {
  // Definir valores de teste
  final value = 0x22;   // Hexadecimal 0x22 = decimal 34, binário 00100010
  final bitmask = 0x0f; // Hexadecimal 0x0f = decimal 15, binário 00001111

  // 1. AND bit a bit &
  print('value & bitmask = ${value & bitmask}'); // 0x02 = 2
  assert((value & bitmask) == 0x02);

  // 2. AND com máscara invertida (& ~mask, muito usado para limpar bits baixos)
  print('value & ~bitmask = ${value & ~bitmask}'); // 0x20 = 32
  assert((value & ~bitmask) == 0x20);

  // 3. OR bit a bit |
  print('value | bitmask = ${value | bitmask}'); // 0x2f = 47
  assert((value | bitmask) == 0x2f);

  // 4. XOR bit a bit ^
  print('value ^ bitmask = ${value ^ bitmask}'); // 0x2d = 45
  assert((value ^ bitmask) == 0x2d);

  // 5. Deslocamento à esquerda <<
  print('value << 4 = ${value << 4}'); // 0x220 = 544
  assert((value << 4) == 0x220);

  // 6. Deslocamento à direita com sinal >> (número positivo)
  print('value >> 4 = ${value >> 4}'); // 0x02 = 2
  assert((value >> 4) == 0x02);

  // 7. Deslocamento à direita com sinal >> (número negativo, comportamento varia entre plataformas)
  print('-value >> 4 = ${-value >> 4}'); // -0x03 = -3
  assert((-value >> 4) == -0x03);

  // 8. Deslocamento à direita sem sinal >>> (positivo, Dart2.14+)
  print('value >>> 4 = ${value >>> 4}'); // 0x02 = 2
  assert((value >>> 4) == 0x02);

  // 9. Deslocamento à direita sem sinal >>> (negativo, resultado sempre maior que 0)
  print('-value >>> 4 = ${-value >>> 4}');
  assert((-value >>> 4) > 0);
}Code language: PHP (php)

Saída da execução

D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
value & bitmask = 2
value & ~bitmask = 32
value | bitmask = 47
value ^ bitmask = 45
value << 4 = 544
value >> 4 = 2
-value >> 4 = -3
value >>> 4 = 2
-value >>> 4 = 1152921504606846973

Análise detalhada de cada exemplo

1 AND bit a bit
00100010
00001111
--------
00000010

O resultado final é 00000010, ou seja, o número decimal 2.

2 AND com máscara invertida & ~mask
00100010
11110000  // ~00001111
---------
00100000  // 0x20 = 32Code language: JavaScript (javascript)

A sequência 11110000 é o resultado de ~mask: todos os bits de 00001111 são invertidos, 0 vira 1 e 1 vira 0

3 OR bit a bit |

00100010
00001111
---------
00101111  // 0x2f = 47Code language: JavaScript (javascript)

O bit resultado é 1 enquanto pelo menos um dos bits for 1; apenas se ambos forem 0 o resultado é 0

4 XOR bit a bit ^

00100010
00001111
---------
00101101  // 0x2d = 45Code language: JavaScript (javascript)

Só obtemos 1 quando os bits superior e inferior forem diferentes; se forem iguais o resultado é 0

5 Deslocamento à esquerda << 4

00100010 << 4 = 001000100000
Resultado: 0x220 = 544

6 Deslocamento à direita com sinal >> 4 (número positivo)

00100010 >> 4 = 00000010
Resultado: 0x02 = 2

7 Deslocamento à direita com sinal >> 4 (número negativo)

-00100010 >> 4 = -00000011
Resultado: -0x03 = -3

8 Deslocamento à direita sem sinal >>> 4 (número positivo)

00100010 >>> 4 = 00000010
Resultado: 0x02 = 2

9 Deslocamento à direita sem sinal >>> 4 (número negativo)

-00100010 >>> 4 = (completa com 0 no lado esquerdo) 00001101...  // resultado sempre maior que 0Code language: JavaScript (javascript)

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *