{{backlinks>.}} ==== 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 {{ :efinf:blc2016:img_20160908_tafel.jpg?direct&300 |Tafelbild}}