Bitmanipulation für Anfänger

From Wurst-Wasser.net
Jump to navigation Jump to search

Von Bits und Bytes

Daten-Typen (Variablen-Typen)

  • 1 Bit ist die kleinste Einheit
    • 1 Bit kann nur 2 Werte annehmen: 0 oder 1 (false oder true)
    • Beispiel: 0
    • Beispiel: 1
  • 1 Byte...
    • ...hat 8 Bit
    • ein Byte kann 256 (2 hoch 7) Werte annehmen: 0 bis 255
    • Beispiel: 0 0 0 0 0 0 0 0 ist der Wert 0
    • Beispiel: 1 0 0 0 0 0 0 0 ist der Wert 128
    • Beispiel: 1 0 0 0 0 0 0 1 ist der Wert 129
    • Beispiel: 1 1 1 1 1 1 1 1 ist der Wert 255
  • 1 Integer[1]
    • hat 4 Byte (32 Bit)
    • kann 4.294.967.296 Werte annehmen: −2.147.483.648 bis 2.147.483.647
    • Beispiele
      • 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 ist der Wert 0
      • 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 ist der Wert 1
      • 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 1 ist der Wert 256
      • 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 ist der Wert 65.536
      • 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 ist der Wert 16.777.216
      • 0 1 1 1 1 1 1 1 | 1 1 1 1 1 1 1 1 | 1 1 1 1 1 1 1 1 | 1 1 1 1 1 1 1 1 ist der Wert 2.147.483.647

Über die Bits eines Bytes oder Integers

  • Das rechteste Bit eines Bytes oder Integers nennt man das LeastSignificantBit[2].
  • Das linkeste Bit eines Bytes oder Integers nennt man das MostSignificantBit[3].
  • Die Wertigkeit der Bit wird genau wie im Dezimal-System vergeben (Basis hoch Stelle)...
    • Dezimal-System
      • Beispiel 1: Die Zahl 1111, also Eintausendeinhundertelf hat 4 Stellen, die rechteste (LSB) Stelle hat den Wertigkeit 1 (10 hoch 0), die linkeste 1000 (10 hoch 3), somit ist der Dezimalwert: 1 * 1000 + 1 * 100 + 1 * 10 + 1 * 1 = 1111 (dezimal)
      • Beispiel 2: Die Zahl 1211, also Eintausendzweihundertelf hat den Dezimalwert: 1 * 1000 + 2 * 100 + 1 * 10 + 1 * 1 = 1211
        Das alles lässt sich genauso auch auf das Binärsystem anwenden:
    • Binär-System
      • Beispiel 1: Die Zahl 1111, also (NICHT Eintausendeinhundertelf) hat 4 Stellen, die rechteste (LSB) Stelle hat den Wertigkeit 1 (2 hoch 0), die linkeste (MSB) 8 (2 hoch 3), somit ist der Dezimalwert: 1 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 15 (dezimal)
      • Beispiel 2: Die Zahl 10000001, hat 8 Stellen, die rechteste (LSB) Stelle hat den Wertigkeit 1 (2 hoch 0), die linkeste (MSB) 127 (2 hoch 7), somit ist der Dezimalwert: 1 * 127 + 1 * 1 = 128 (Dezimal)

Bit-Shifts

  • SHL verschiebt die Bits eines Bytes oder Integers nach links
    • Beispiele:
var a, b: integer;
a:=1;       // a ist: 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1
b:=a shl 8; // b ist: 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0
            // (Alle Bits wurden um 8 Stellen nach links verschoben; b ist also 256) 
a:=65.536;   // a ist: 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1
b:=a shl 16; // b ist: 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0
             // (Alle Bits wurden um 16 Stellen nach links verschoben, das rote wurde ins Nirvana verschoben,
             // das grüne landete tats. 16 Stellen weiter links; b ist also 65.535
  • SHR verschiebt die Bits eines Bytes oder Integers nach rechts
    • Beispiele:
var a, b: integer;
a:=65.536;   // a ist: 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1
b:=a shr 16; // b ist: 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1
             // (Alle Bits wurden um 16 Stellen nach rechts verschoben; b ist also 1;
             // das grüne Bit ist leider rechts runtergefallen)

Bitmasken mit and und or

Boolsche Algebra


  1. wir meinen Signed-32-Bit Integer, 8-, 16- und 64-Bit-Integer und unsigned lassen wir mal weg :)
  2. auch LSB genannt
  3. auch MSB genannt