efinf:blc2016:lektion20160908

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
efinf:blc2016:lektion20160908 [2016/09/11 09:21] Ivo Blöchligerefinf:blc2016:lektion20160908 [2016/09/11 09:21] (current) – [Donnerstag 8. September 2016] Ivo Blöchliger
Line 1: Line 1:
 +{{backlinks>.}}
 +==== Donnerstag 8. September 2016 ====
 +
 +=== Logische Operationen, Bitweise Operationen ===
 +  * and, or, not
 +  * xor, nand
 +
 +^ ^ and ^ or ^ not ^ xor ^
 +^ Logisch | && | <nowiki>||</nowiki> | ! | <nowiki>^</nowiki> |
 +^ Bitweise | & | <nowiki>|</nowiki> | ~ | <nowiki>^</nowiki> |
 +
 +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".
 +<code ruby>
 +21 << 1
 +42 >> 2
 +</code>
 +
 +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.
 +<code ruby>
 +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)
 +</code>
 +
 +**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.
 +<code ruby>
 +f = 0xff8020
 +
 +r = f >> 16
 +g = (f >> 8) & 0xff
 +b = f & 0xff
 +</code>
 +
 +**Aufgabe**: 16-Bit Farbwerte (5+6+5 Bits, r,g,b). Umrechnungen
 +<code ruby>
 +# 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
 +</code>
 +
 +{{ :efinf:blc2016:img_20160908_tafel.jpg?direct&300 |Tafelbild}}