Dart Bit- und Shift-Operatoren

Bearbeitet jedes einzelne Bit der Binärdarstellung von Zahlen und wird nur mit Ganzzahlen verwendet

Tabelle der Bitoperatoren und Shift-Operatoren

OperatorBezeichnungBerechnungsregel
&Bitweises UND (AND)Ergebnisbit ist nur dann 1, wenn die beiden entsprechenden Binärbits gleichzeitig 1 sind, sonst 0
|Bitweises ODER (OR)Ergebnisbit ist 1, wenn mindestens eines der passenden Binärbits 1 ist, sonst 0
^Bitweises XOR (Exklusiv-ODER)Ergebnisbit ist 1, wenn die entsprechenden Binärbits unterschiedlich sind, bei identischen Werten 0
~exprBitweise Negation (unärer Operator)Alle Binärbits werden umgekehrt: 0 ↔ 1, aus 0 wird 1 und aus 1 wird 0
<<Linksverschiebung Shift leftDie gesamte Binärfolge wird um N Stellen nach links verschoben, rechts werden Nullen aufgefüllt
>>Vorzeichenbehaftete Rechtsverschiebung Shift rightBinärfolge um N Stellen nach rechts schieben, links wird das Vorzeichenbit aufgefüllt (bei positiven Zahlen 0, bei negativen Zahlen 1)
>>>Vorzeichenlose Rechtsverschiebung Unsigned shift rightBinärfolge um N Stellen nach rechts schieben, links werden durchgängig Nullen eingefügt; negative Zahlen werden zuerst als vorzeichenlose 32-Bit-Ganzzahl umgewandelt, dann verschoben

Bitweises UND (&)

Das Ergebnisbit ist 1 nur dann, wenn beide zugehörigen Binärbits gleichzeitig 1 sind; sonst ist das Ergebnisbit 0.

Erste Zahl (Bit)Zweite Zahl (Bit)Ergebnis
111
100
010
000

Beispiel

void main() {
  // Ein-Bit Test
  assert((1 & 1) == 1);
  assert((1 & 0) == 0);
  assert((0 & 1) == 0);
  assert((0 & 0) == 0);

  // Mehrbit Ganzzahl Beispiel
  final a = 0x22; // Binär 00100010
  final b = 0x0f; // Binär 00001111
  assert((a & b) == 0x02); // Ergebnis 00000010
}Code-Sprache: PHP (php)

Bitweises ODER (|)

Das Ergebnisbit ist 1, falls mindestens eines der beiden passenden Binärbits 1 ist; sonst 0.

Erste Zahl (Bit)Zweite Zahl (Bit)Ergebnis
111
101
011
000
void main() {
  // Ein-Bit Test
  assert((1 | 1) == 1);
  assert((1 | 0) == 1);
  assert((0 | 1) == 1);
  assert((0 | 0) == 0);

  // Mehrbit Ganzzahl Beispiel
  final a = 0x22; // Binär 00100010
  final b = 0x0f; // Binär 00001111
  assert((a | b) == 0x2f); // Ergebnis 00101111
}Code-Sprache: PHP (php)

Bitweises XOR (^)

Ergebnisbit ist 1, wenn die beiden zugehörigen Binärbits unterschiedliche Werte haben; bei identischen Werten wird 0 ausgegeben.

Erste Zahl (Bit)Zweite Zahl (Bit)Ergebnis
110
101
011
000

Beispiel

void main() {
  // Ein-Bit Test
  assert((1 ^ 1) == 0);
  assert((1 ^ 0) == 1);
  assert((0 ^ 1) == 1);
  assert((0 ^ 0) == 0);

  // Mehrbit Ganzzahl Beispiel
  final a = 0x22; // Binär 00100010
  final b = 0x0f; // Binär 00001111
  assert((a ^ b) == 0x2d); // Ergebnis 00101101
}Code-Sprache: PHP (php)

Bitweise Negation (~)

Unärer Operator, benötigt nur einen Operanden; er kehrt jedes einzelne Binärbit um: aus 0 wird 1, aus 1 wird 0.

EingangsbitErgebnisbit
10
01

Beispiel

void main() {
  // Ein-Bit Test
  assert((~1 & 1) == 0);
  assert((~0 & 1) == 1);

  // Mehrbit Ganzzahl Beispiel
  final a = 0x22; // Binär 00100010
  final mask = 0x0f; // Binär 00001111
  assert((a & ~mask) == 0x20); // Negiere mask und UND mit a, lösche untere 4 Bits
}Code-Sprache: PHP (php)

Weiteres Beispiel

void main() {
  // Testwerte definieren
  final value = 0x22;   // Hex 0x22 = Dez 34, Binär 00100010
  final bitmask = 0x0f; // Hex 0x0f = Dez 15, Binär 00001111

  // 1. Bitweises UND &
  print('value & bitmask = ${value & bitmask}'); // 0x02 = 2
  assert((value & bitmask) == 0x02);

  // 2. UND mit negierter Maske (& ~mask, häufig zum Löschen niederer Bits)
  print('value & ~bitmask = ${value & ~bitmask}'); // 0x20 = 32
  assert((value & ~bitmask) == 0x20);

  // 3. Bitweises ODER |
  print('value | bitmask = ${value | bitmask}'); // 0x2f = 47
  assert((value | bitmask) == 0x2f);

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

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

  // 6. Vorzeichenbehaftete Rechtsverschiebung >> (positive Zahl)
  print('value >> 4 = ${value >> 4}'); // 0x02 = 2
  assert((value >> 4) == 0x02);

  // 7. Vorzeichenbehaftete Rechtsverschiebung >> (negative Zahl, plattformabhängiges Verhalten)
  print('-value >> 4 = ${-value >> 4}'); // -0x03 = -3
  assert((-value >> 4) == -0x03);

  // 8. Vorzeichenlose Rechtsverschiebung >>> (positiv, ab Dart2.14)
  print('value >>> 4 = ${value >>> 4}'); // 0x02 = 2
  assert((value >>> 4) == 0x02);

  // 9. Vorzeichenlose Rechtsverschiebung >>> (negativ, Ergebnis immer positiv)
  print('-value >>> 4 = ${-value >>> 4}');
  assert((-value >>> 4) > 0);
}Code-Sprache: PHP (php)

Ausgabeergebnis

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

Einzelne Aufschlüsselung der Beispiele

1 Bitweises UND
00100010
00001111
--------
00000010

Das Endergebnis ist 00000010, also die Dezimalzahl 2.

2 Bitweises UND mit negierter Maske & ~mask
00100010
11110000  // ~00001111
---------
00100000  // 0x20 = 32Code-Sprache: JavaScript (javascript)

11110000 ist das Ergebnis von ~mask: bei 00001111 werden alle Bits umgekehrt, 0 wird zu 1 und 1 zu 0.

3 Bitweises ODER |

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

Das Ergebnisbit ist 1, solange mindestens ein Bit 1 ist; nur wenn beide Bits 0 sind, ergibt sich 0.

4 Bitweises XOR ^

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

Nur bei unterschiedlichen oberen und unteren Bits wird 1 ausgegeben, bei identischen Bits steht 0.

5 Linksverschiebung << 4

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

6 Vorzeichenbehaftete Rechtsverschiebung >> 4 (positive Zahl)

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

7 Vorzeichenbehaftete Rechtsverschiebung >> 4 (negative Zahl)

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

8 Vorzeichenlose Rechtsverschiebung >>> 4 (positive Zahl)

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

9 Vorzeichenlose Rechtsverschiebung >>> 4 (negative Zahl)

-00100010 >>> 4 = (links mit 0 aufgefüllt) 00001101...  // Ergebnis ist immer größer als 0Code-Sprache: JavaScript (javascript)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert