Computer speichert Informationen im BinÀrformat:
1 oder 0 (= genannt Bit)
Kombination von mehreren Ziffern bildet BinÀrzahl: 1001
Jede Stelle der BinĂ€rzahl steht fĂŒr eine Zweierpotenz:
\(2^0 = 1, 2^1 = 2, 2^2 = 4, 2^3 = 8, ...\)
79 = 64 + 8 + 4 + 2 + 1| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 |
| 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 |
0000 0010 x 256 + 0100 1111| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 0 (MSBit) | 1 | 0 | 0 | 1 | 1 | 1 | 1 (LSBit) |
110 (BinĂ€r) â 110 (Dezimal)110B = 6Dtrue oder false evaluieren kann, heiĂt boolescher AusdruckLogischer Datentyp (bool)
true und falsebool b;b = true;Logische Operatoren
| Name | Symbol | Beispiel |
|---|---|---|
| UND (AND) |
&& | b && (x < 7) |
| ODER (OR) |
|| | b || x > 8 |
| Negation (NOT) |
! | !b |
Den Umgang mit boolescher Logik lernen wir jetzt kennen!
| Operation | Bool. Algebra | C |
|---|---|---|
| UND | \(A\wedge B\) | A && B |
| ODER | \(A\vee B\) | A || B |
| NEGATION | \(\overline{A}\) | !A |
\(\bf{A\wedge B}\)
\(\bf{A\vee B}\)
\(\bf{\overline{A}}\)
true, sobald mindestens einer der beiden TeilausdrĂŒcke wahr ist| A | B | \(A \vee B\) |
|---|---|---|
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
\(\bf{A\vee B}\)
true, sobald beide TeilausdrĂŒcke wahr sind| A | B | \(A \wedge B\) |
|---|---|---|
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
\(\bf{A\wedge B}\)
| A | \(\overline{A}\) |
|---|---|
0 |
1 |
1 |
0 |
\(\bf{\overline{A}}\)
Boolesche AusdrĂŒcke können natĂŒrlich mehr als zwei Variablen beinhalten
â Schrittweise Evaluierung von links nach rechts
Setzt Klammern, um eindeutige Auswertungsreihenfolge zu erzwingen â Lesbarkeit
Beispiel: (!A && B) || (A && !B)
bool A = false; bool B = true;
Kommutativgesetz
Assoziativgesetz
Distributivgesetz
OR kann wie eine Addition gesehen werden
â Alt. Schreibweise: \(A \vee B = A + B\)
AND wie eine Multiplikation
â Alt. Schreibweise: \(A \wedge B = AB\)
Es gilt: âPunkt vor Strichâ
Erleichtert das âRechnenâ mit booleschen AusdrĂŒcken
| Bool. Algebra | C | |
|---|---|---|
| 1. | \(A \wedge 1 = A\) | (A && true) â A |
| 2. | \(A \wedge 0 = 0\) | (A && false) â false |
| 3. | \(A \vee 0 = A\) | (A || false) â A |
| 4. | \(A \vee 1 = 1\) | (A || true) â true |
| 5. | \(A \vee A = A\) | (A || A) â A |
| 6. | \(A \vee \overline{A} = 1\) | (A || !A) â true |
| Bool. Algebra | C | |
|---|---|---|
| 7. | \(A \wedge A = A\) | (A && A) â A |
| 8. | \(A \wedge \overline{A} = 0\) | (A && !A) â false |
| 9. | \(\overline{\overline{A}} = A\) | !(!A) â A |
| 10. | \(A \vee (A\wedge B) = A\) | (A || (A && B)) â A |
| \(\Rightarrow A (1 \vee B)\) | Faktorisierung (Distributivgesetz) | |
| \(= A \wedge 1\) | Regel 4: \(1 \vee B = 1\) | |
| \(= A\) | ||
| 11. | \(A \vee \overline{A}B = A \vee B\) | (A || (!A && B)) â (A || B) |
Die Herleitung von Regel 11 schauen wir uns einmal als Beispiel an
Herleitung: \(A \vee \overline{A}B = A \vee B\)
| \(A + \overline{A}B\) | |
| \(= (A + AB) + \overline{A}B\) | Regel 10: \(A = A + AB\) |
| \(= (AA + AB) + \overline{A}B\) | Regel 7: \(A = AA\) |
| \(= AA + AB + A\overline{A} + \overline{A}B\) | HinzufĂŒgen von: \(A\overline{A} = 0\) |
| \(= (A + \overline{A})(A + B)\) | Faktorisierung |
| \(= 1 (A + B)\) | Regel 6: \(A + \overline{A} = 1\) |
| \(= A + B\) |
| \((A + B)(A + C)\) | |
| \(=AA + AC + AB + BC\) | Distributivgesetz |
| \(=A + AC + AB + BC\) | Regel 7: \(A = AA\) |
| \(=A (1 + C) + AB + BC\) | Faktorisierung (Distributivgesetz) |
| \(=A + AB + BC\) | Regel 4: \(1 + C = 1\) |
| \(=A (1+ B) + BC\) | Faktorisierung (Distributivgesetz) |
| \(=A + BC\) | Regel 4: \(1 + B = 1\) |
| Bool. Algebra | C | |
|---|---|---|
| 1. | \(\overline{AB} = \overline{A} \vee \overline{B}\) | !(A && B) â !A || !B |
| 2. | \(\overline{(A \vee B}) = \overline{A} \wedge \overline{B}\) | !(A || B) â !A && !B |
Die De-Morganschen Regeln gelten auch fĂŒr mehr als zwei Variablen:
\(\overline{ABC} = \overline{A} \vee \overline{B} \vee \overline{C}\)
Das war jetzt genug Theorie. ZurĂŒck zu C!
Gleichen Operationen wie zuvor fĂŒr die Manipulation von Bits
Wichtig: Separate Evaluierung fĂŒr jedes Bit
Verkettung von Operationen auch hier möglich
(Klammern fĂŒr Leserlichkeit und Operator-PrĂ€zedenzen beachten!)
| Operation | Operator |
|---|---|
| OR | | |
| AND | & |
| NOT | ~ |
| XOR | ^ |
| Links-Shift | << |
| Rechts-Shift | >> |
(Bitweise Operatoren)
1 â Ergebnis ist auch 10, falls beide Bits Wert 0 haben| A | B | A | B |
|---|---|---|
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0011 |
1100 |
1111 |
1010 |
1001 |
1011 |
Wende AND-Operation separat jedes Bit zweier Zahlen an
Sind beide Bits 1
â Ergebnis ist auch 1
| A | B | A & B |
|---|---|---|
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0011 |
1100 |
0000 |
1010 |
1001 |
1000 |
| A | ~A |
|---|---|
0 |
1 |
1 |
0 |
0011 |
1100 |
1010 |
0101 |
Ist genau ein Bit 1 â Ergebnis ist 1
Anders ausgedrĂŒckt:
Bei Vereinigung zweier Mengen darf ein Element nur in einer Menge existieren
HĂ€ufige Notation: \(A\oplus B\)
XOR ist reversibel: \((A\oplus B) \oplus B = A\)
| A | B | A ^ B |
|---|---|---|
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0011 |
1100 |
1111 |
1010 |
1001 |
0011 |
0011 |
1001 |
1010 |
Passwort P in Bitmuster ĂŒbersetzen und abschnittsweise auf Text T anwenden
â Nicht lesbares Ergebnis \(T \oplus P\)
EntschlĂŒsselung: \((T\oplus P) \oplus P = T\)
#include <stdio.h>
int main() {
int msg = 0x07; // 0000 0111
int passwd = 0xAA; // 1010 1010
int enc = msg ^ passwd; // 1010 1101
printf("%#X\n", enc);
// Umkehren zu Klartext
enc ^= passwd; // 0000 0111
printf("%#X\n", enc);
return 0;
}
n Bits nach links bzw. rechtsn MSBits entferntn LSBits entfernt| A | n |
A << n |
|---|---|---|
0010 |
0 |
0010 |
0010 |
1 |
0100 |
0010 |
2 |
1000 |
| A | n |
A >> n |
|---|---|---|
0101 |
0 |
0101 |
0101 |
1 |
0010 |
0101 |
2 |
0001 |
#include <stdio.h>
int main() {
int i = 0x1; // 0001
printf("%d, %x\n", i, i);
printf("%d, %x\n", i << 31, i << 31);
return 0;
}
#include <stdio.h>
int main() {
int bit_pattern = 0x07; // 0111
bit_pattern = bit_pattern | (1 << 3);
printf("%#01x\n", bit_pattern);
return 0;
}
Achtung: Wegen Operator-PrÀzedenz Klammern beachten!
1 bestimmt das Bit0Links-Shift um 2 mit (1 << 2)
Bitmuster: ...0 0100
Negierung: ~(1 << 2)
Bitmuster: ...1 1011
AND: bit_pattern & ~(1 << 2)
#include <stdio.h>
int main() {
int bit_pattern = 0x07; // 0111
bit_pattern = bit_pattern & ~(1 << 2);
printf("%#01x\n", bit_pattern);
return 0;
}
#include <stdio.h>
int main() {
int bit_pattern = 0x07; // 0111
bit_pattern = bit_pattern ^ (1 << 1);
printf("%#01x\n", bit_pattern);
return 0;
}
#include <stdio.h>
int main() {
int bit_pattern = 0x07; // 0111
printf("Is set: %#01x\n", bit_pattern & (1 << 0));
return 0;
}
#include <stdio.h>
int main() {
int bit_pattern = 0x07; // 0111
if (bit_pattern & (1 << 0)) {
printf("Bit 1 is set\n");
} else {
printf("Bit 1 is not set\n");
}
return 0;
}
#include <stdint.h>
#include <stdio.h>
int main() {
uint64_t message = 0x0;
uint32_t temperature = 33; // 100001
message |= (temperature << 16) & 0xFF0000;
printf("temperature = %#01x, message = %#01lx\n",
temperature, message);
return 0;
}
int, 4 Bytes| 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| 0 (MSBit) | 0 | 1 | 1 | 1 | 1 (LSBit) |
| 1 | 2 | 4 | 8 | 16 | 32 |
|---|---|---|---|---|---|
| 1 (LSBit) | 1 | 1 | 1 | 0 | 1 (MSBit) |
| Byte 0 | Byte 1 | ⊠|
|---|---|---|
0x07 |
0x01 |
⊠|
Bei Interpretation bei Zahl als 1 Byte und als 2 Bytes:
â Start bei gleicher Speicher-Adresse (Bit 0 in Byte 0 â âganz linksâ)
Verschiedene Prozessorhersteller legten fĂŒr Produkte eine Reihenfolge fest
Alternative Bezeichung
Intel, AMD (CPUs fĂŒr Desktop/Laptop) â Little Endian
ARM (Mobile/Mikrocontroller) â UnterstĂŒtzen beides
Keine Sorge: Compiler ĂŒbernimmt automatisch die Konvertierung
â Wir mĂŒssen (erst mal) nichts tun! đ