![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() ![]()
Kommen wir nun zu den Bitweisen Operatoren. Als erstes will zur Einfachheit das Kapitel dazu etwas theoretischer halten.
Wenn sie das Programm ausgeführt haben werden sie sich sicher fragen warum der Wert von x durch...
nun 7 ist? Schauen wir uns doch mal die Bitdarstellung der beiden Zahlen an...
An dieser Tabelle können sie erkennen das alle Bitnummern bei der beide auf 1 stehen weiterhin auf 1 stehen bleiben und alle anderen bleiben bzw. werden auf 0 gestellt. Daraus ergibt sich folgende Regel für die AND-Verknüpfung.....
Mit dem AND - Operator können sie außerdem prima testen ob ein Zahl gerade oder ungerade ist...
Auch sehr häufig wird dieser Operator verwendet um einzelne Bits auf 0 zu setzen. Um zum Beispiel das 3.Bit zu löschen benötigen wir nur eine Maske. Die Maske lautet für das 3.Bit...
Nun können sie den Wert entweder in einen Dezimalen umrechnen (123) oder wie wir schon im Kapitel zuvor kennen gelernt haben in eine Hexzahl : 0x7B
...oder...
Somit hätten wir egal welchen Wert zahl hat das 3.Bit (falls gesetzt) gelöscht...(Beispiel: 128&123 oder eben 128&0x7B)
Natürlich haben sie bei den bitweise Operatoren auch folgendende Schreibweise...
... die gleich zu der vorangegangenen ist.
Wir wollen jetzt zum Beispiel bei der Zahl 0 alle Bits bis auf Bit7 und Bit1 setzen. Zuerst benötigen wir wieder eine Maske. Benutzen sie die Hextabelle im Kapitel zuvor. Damit ist es einfacher. Also benötigen wir folgende Maske...
Also gehen wir wie folgt vor...
Somit sieht unsere interne Bitdarstellung folgendermaßen aus...
Natürlich hätten sie auch folgende schreibweiße benutzen können....
Der Exclusiv-OR-Operator ^ (XOR)
Dieser Operator eignet sich prima dazu um Bits umzuschalten. Das heißt gesetzte Bits werden gelöscht und umgekehrt. Wenden wir unseren Operator einfach mal wahllos an...
...an...
Als Ergebnis erhalten wir die Zahl 35 zurück. Auch hier können sie folgende Schreibweise benutzten...
Der NOT-Operator ~
Bei vorzeichenbehaftete Datentypen entspricht das einer Negation plus der Subtraktion von 1....
...dies sieht folgendermaßen aus.....
Somit bekommen sie das Ergebnis -21 zurück.
Aus 8 wird die Zahl 16. Sehen wir uns mal an warum.....
Hier sehen sie wie Bit3 mittels....
...um 1 Bit zu Bit4 nach links verschoben wurde. Manch einer wird es jetzt schon bemerkt haben das hier eine Multiplikation durchgeführt haben. Somit lassen sich prima die Zahlen Potenzieren. Die Bitstelle um eine Position nach links bedeutet eine Multiplikation mit 2. Um zwei Stellen nach links wir mit 4 Multipliziert, um drei mit 8, um vier mit 16 usw...
Unser folgendes Beispiel errechnet nun immer die Potenz der Vorangegangenen Zahl.....
Wir Potenzieren hier eine 32Bit lange Zahl vom Typ long bei der nach jeder for-Schleife das Bit um eine Stelle nach links geschoben wird. Sollte unser Schleifenzeilen die 8.Potenz auch noch ausführen so bekommen sie als Wert 0 zurück da bei der 7.Potenz der Wert bereits an der letzten Stelle gestanden hat und wenn wir Ihn um eine Stellen nach links schieben schieben wir Ihn praktisch ganz raus. In der Sprache C gibt keinen Befehl wie in Assembler RCL (Rotate trough Carry left) der bewirkt das falls das Carry-Flag des Prozessors gesetzt ist die 1 z.B. durch...
das Carry-Bit bei den kleinsten Bit0 wieder reinschiebt. Doch das geht hier zu weit.
Welchen Vorteil hat den nun eine Multiplikation mit einer Linksverschiebung? Zum Beispiel bei Programmen bei denen es auf schnelle Berechnungen ankommt, z.B. Spiele, da die Bitverschiebung ca. 40(!) mal schneller als normale Multiplikationen sind.
Somit erhalten wir als Ergebnis die 8. ![]() ![]() ![]() |