| 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).
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