In diesem Teil werden wir nicht mit den Zahlen an sich arbeiten, sondern mit den Binärwerten, welche die Zahlen im Speicher repräsentieren. Im Folgenden werden also Operatoren vorgestellt, welche Bitwerte verknüpfen.
AND – UND Verknüpfung
Bei der bitweisen UND-Verknüpfung hat das Ergebnis an den Stellen eine 1, an denen beide Vergleichswerte eine 1 besitzen. Das Operatorzeichen dafür ist das einfache Kaufmanns-Und &.
Hier werden die Zahlen 10 und 7 UND verknüpft. Unter der Bildschirmausgabe ist die Rechnung zu sehen, welche dieser Operator macht.
int a=10, b=7, c; c = a & b; printf("c: %d\n", c);
c: 2
Zugehörige Rechnung der UND-Verknüpfung a: 10 dez => 1010 binär b: 7 dez => 0111 binär 1010 UND 0111 ----------- 0010 c: 10 binär => 2 dezimal
OR – ODER Verknüpfung
Bei der bitweisen ODER-Verknüpfung hat das Ergebnis an den Stellen eine 1, an denen mindestens einer der beiden Vergleichswerte eine 1 besitzt. Das Operatorzeichen dafür ist das einfache Pipe-Zeichen |.
int a=10, b=6, c; c = a | b; printf("c: %d\n", c);
c: 14
Zugehörige Rechnung der ODER-Verknüpfung a: 10 dez => 1010 binär b: 6 dez => 0110 binär 1010 OR 0110 ----------- 1110 c: 1110 binär => 14 dezimal
XOR – Exklusiv ODER Verknüpfung
Bei der bitweisen XOR Verknüpfung hat das Ergebnis an den Stellen eine 1, an denen entweder der eine oder der andere Vergleichswert eine 1 besitzt. Das Operatorzeichen dafür ist das Dach-Zeichen ^.
int a=10, b=6, c; c = a ^ b; printf("c: %d\n", c);
c: 12
Zugehörige Rechnung der XOR-Verknüpfung 1010 XOR 0110 ----------- 1100 c: 1100 binär => 12 dezimal
Negation
Bei der bitweisen Negation wird jedes Bit umgekehrt: aus 0 wird 1 und aus 1 wird 0. Das Operator-Zeichen dafür ist die Tilde ~. Der Wert 6 (0110 binär) ergibt negiert 9 (1001 binär). Allerdings wird dadurch auch das Vorzeichen-Bit negiert, wodurch das Vorzeichen geändet wird. Wegen dem Überlauf sollte man noch 1 addieren, um wieder die gleiche Zahl (mit geändertem Vorzeichen) zu erhalten. Der Befehl itoa() gibt eine Zahl in Binärform wieder und ist nicht Teil des ANSI-C Standards.
int b=6; char str[100]; printf("b binaer: %s\n", itoa(b, str, 2)); printf("b dezimal: %d\n", b); b = ~b; printf("b binaer: %s\n", itoa(b, str, 2)); printf("b dezimal: %d\n", b); b++; printf("b binaer: %s\n", itoa(b, str, 2)); printf("b dezimal: %d\n", b);
b binaer: 110 b dezimal: 6 b binaer: 11111111111111111111111111111001 b dezimal: -7 b binaer: 11111111111111111111111111111010 b dezimal: -6
Bit-Verschiebung
Die Bits eines Wertes können nach links oder rechts verschoben werden. Die Bits am Rand fallen somit raus, die Stellen auf der anderen Seite werden mit Nullen aufgefüllt. Die Linksverschiebung geht mit <<, die Rechtsverschiebung mit >>.
Hier wird der Wert 5 jeweils nach links und rechts um eine Stelle verschoben.
int b=5, c, d; c = b << 1; d = b >> 1; printf("c: %d, d: %d\n", c, d);
c: 10, d: 2
b: 5 dez => 0101 binär c: 0101 << 1 => 1010 binär => 10 dezimal d: 0101 >> 1 => 0010 binär => 2 dezimal