Donnerstag 8. September 2016
Logische Operationen, Bitweise Operationen
- and, or, not
- xor, nand
and | or | not | xor | |
---|---|---|---|---|
Logisch | && | || | ! | ^ |
Bitweise | & | | | ~ | ^ |
Ruby kennt auch noch die logischen Operatoren and
, or
und not
, die eine tiefere Präzedenz als (fast) alle anderen Operatoren haben. In if-Abfragen sind die Operatoren in der Tabelle zu verwenden (sonst muss geklammert werden).
Shift-Operatoren
Bits können nach links oder rechts verschoben werden. Das entspricht einer Multiplikation mit einer 2er Potenz (bzw. Division). Beim rechts verschieben “fallen” Bits rechts “heraus”.
21 << 1 42 >> 2
Beispiel: Gegeben drei natürliche Zahlen r,g,b zwischen 0 und 255 (Farbwerte). Diese Werte sollen in eine einzige Zahl (24-Bit) codiert werden, so dass r das höchstwertige Byte ist.
r = 123 g = 12 b = 211 # Lösung 1: f = 256*256*r + 256*g + b puts f.to_s(16) # Lösung 2: f = r << 16 | g << 8 | b puts f.to_s(16)
Aufgabe: Gegeben ist f, eine 24-Bit Zahl. Extrahieren Sie die 3 Bytes r,g,b, wobei r das höchstwertige Byte ist. Lösen Sie die Aufgabe einmal mit Arithmetik, einmal mit Bit-Manipulationen.
f = 0xff8020 r = f >> 16 g = (f >> 8) & 0xff b = f & 0xff
Aufgabe: 16-Bit Farbwerte (5+6+5 Bits, r,g,b). Umrechnungen
# Kodierung: r = 23 #Max 31 g = 43 #Max 64 b = 12 #Max 31 f = b | (g << 5) | (r << 11) # Dekodierung r = f>>11 g = (f >> 5) & 0b11_1111 b = f & 0b1_1111