Operadores bit a bit y de desplazamiento Dart

Opera con cada bit individual de la representación binaria de los números, solo se usa con números enteros

Tabla de operadores bit a bit y operadores de desplazamiento

OperadorNombreRegla de cálculo
&AND bit a bitEl bit resultado solo es 1 cuando los bits binarios correspondientes son ambos 1, en cualquier otro caso es 0
|OR bit a bitEl bit resultado es 1 si al menos uno de los bits binarios coincidentes vale 1, sino es 0
^XOR bit a bit (OR exclusivo)El bit resultado es 1 cuando los bits binarios correspondientes son distintos, si son iguales vale 0
~exprNegación bit a bit (operador unario)Invierte todos los bits binarios: 0 ↔ 1, el 0 pasa a ser 1 y el 1 pasa a ser 0
<<Desplazamiento hacia la izquierda Shift leftToda la secuencia binaria se desplaza N posiciones a la izquierda, rellenando con ceros por la derecha
>>Desplazamiento derecho con signo Shift rightLa cadena binaria se mueve N posiciones a la derecha, rellenando por la izquierda con el bit de signo (0 para positivos, 1 para negativos)
>>>Desplazamiento derecho sin signo Unsigned shift rightLa secuencia binaria se desplaza N posiciones a la derecha, siempre rellenando con ceros por la izquierda; los números negativos se convierten primero a entero de 32 bits sin signo antes de desplazar

Operador AND bit a bit (&)

El bit resultado vale 1 únicamente si ambos bits correspondientes son 1; en cualquier otro caso el bit es 0.

Bit primer númeroBit segundo númeroResultado operación
111
100
010
000

Ejemplo

void main() {
  // Comprobación bit individual
  assert((1 & 1) == 1);
  assert((1 & 0) == 0);
  assert((0 & 1) == 0);
  assert((0 & 0) == 0);

  // Ejemplo con entero multi-bit
  final a = 0x22; // Binario 00100010
  final b = 0x0f; // Binario 00001111
  assert((a & b) == 0x02); // Resultado 00000010
}Lenguaje del código: PHP (php)

Operador OR bit a bit (|)

El bit resultado es 1 si al menos uno de los dos bits coincidentes es 1; solo será 0 si ambos bits son 0.

Bit primer númeroBit segundo númeroResultado operación
111
101
011
000
void main() {
  // Comprobación bit individual
  assert((1 | 1) == 1);
  assert((1 | 0) == 1);
  assert((0 | 1) == 1);
  assert((0 | 0) == 0);

  // Ejemplo con entero multi-bit
  final a = 0x22; // Binario 00100010
  final b = 0x0f; // Binario 00001111
  assert((a | b) == 0x2f); // Resultado 00101111
}Lenguaje del código: PHP (php)

Operador XOR bit a bit (^)

El bit resultado es 1 cuando los dos bits correspondientes tienen valores distintos; si son iguales el resultado es 0.

Bit primer númeroBit segundo númeroResultado operación
110
101
011
000

Ejemplo

void main() {
  // Comprobación bit individual
  assert((1 ^ 1) == 0);
  assert((1 ^ 0) == 1);
  assert((0 ^ 1) == 1);
  assert((0 ^ 0) == 0);

  // Ejemplo con entero multi-bit
  final a = 0x22; // Binario 00100010
  final b = 0x0f; // Binario 00001111
  assert((a ^ b) == 0x2d); // Resultado 00101101
}Lenguaje del código: PHP (php)

Operador negación bit a bit (~)

Operador unario, solo requiere un operando, invierte cada bit binario uno por uno: el 0 pasa a ser 1 y el 1 pasa a ser 0.

Bit originalBit invertido
10
01

Ejemplo

void main() {
  // Comprobación bit individual
  assert((~1 & 1) == 0);
  assert((~0 & 1) == 1);

  // Ejemplo con entero multi-bit
  final a = 0x22; // Binario 00100010
  final mask = 0x0f; // Binario 00001111
  assert((a & ~mask) == 0x20); // Niega mask y hace AND con a, borra los 4 bits bajos
}Lenguaje del código: PHP (php)

Veamos un ejemplo completo

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

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

  // 2. AND con máscara negada (& ~mask, usado habitualmente para borrar bits bajos)
  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. Desplazamiento izquierdo <<
  print('value << 4 = ${value << 4}'); // 0x220 = 544
  assert((value << 4) == 0x220);

  // 6. Desplazamiento derecho con signo >> (número positivo)
  print('value >> 4 = ${value >> 4}'); // 0x02 = 2
  assert((value >> 4) == 0x02);

  // 7. Desplazamiento derecho con signo >> (número negativo, comportamiento variable entre plataformas)
  print('-value >> 4 = ${-value >> 4}'); // -0x03 = -3
  assert((-value >> 4) == -0x03);

  // 8. Desplazamiento derecho sin signo >>> (positivo, Dart2.14+)
  print('value >>> 4 = ${value >>> 4}'); // 0x02 = 2
  assert((value >>> 4) == 0x02);

  // 9. Desplazamiento derecho sin signo >>> (negativo, resultado siempre mayor que 0)
  print('-value >>> 4 = ${-value >>> 4}');
  assert((-value >>> 4) > 0);
}Lenguaje del código: PHP (php)

Salida de ejecución

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

Desglose paso a paso de cada ejemplo

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

El resultado final es 00000010, es decir el número decimal 2.

2 AND con máscara negada & ~mask
00100010
11110000  // ~00001111
---------
00100000  // 0x20 = 32Lenguaje del código: JavaScript (javascript)

La secuencia 11110000 es el resultado de ~mask: se invierten todos los bits de 00001111, 0 pasa a 1 y 1 pasa a 0

3 OR bit a bit |

00100010
00001111
---------
00101111  // 0x2f = 47Lenguaje del código: JavaScript (javascript)

El bit resultado es 1 mientras al menos uno de los bits sea 1; solo si ambos son 0 el resultado es 0

4 XOR bit a bit ^

00100010
00001111
---------
00101101  // 0x2d = 45Lenguaje del código: JavaScript (javascript)

Solo se obtiene 1 cuando los bits superior e inferior son distintos; si coinciden el resultado es 0

5 Desplazamiento izquierdo << 4

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

6 Desplazamiento derecho con signo >> 4 (número positivo)

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

7 Desplazamiento derecho con signo >> 4 (número negativo)

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

8 Desplazamiento derecho sin signo >>> 4 (número positivo)

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

9 Desplazamiento derecho sin signo >>> 4 (número negativo)

-00100010 >>> 4 = (rellena con 0 por la izquierda) 00001101...  // resultado siempre mayor que 0Lenguaje del código: JavaScript (javascript)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *