Suche
Suche Menü

Bitmanipulation

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