Bitweise Operatoren im Beispiel, bitte um Erklärung
-
Hi,
ich bin in einem Quellcode auf folgende Zeilen gestoßen:if(1&(i))
if(1&((0x0c>>i)+j))
Also die beiden Zeilen stehen nicht direkt im Zusammenhang mir geht es hier um das Verständnis. Was ist das 1& hier? Ich kenne das als Bitweisen vergleich bei dem am Ende eine Zahl rauskommt die genau die Stellen/Bits 1 hat, an dehnen beide Argumente des Operators auch eine 1 haben. In diesem Fall verstehe ich jetzt aber die Abfrage nicht. Ok eins ist klar: 1&i würde dann entweder 1 oder 0 liefern d.h. es passt schon in dne Kontext einer if Abfrage, aber ist das eine gängige Praxis, wann macht man sowas (solche Zeilen tauchen häufiger im Quellcode auf und immer mit 1&) oder kann man das nur Kontextabhängig erschliessen?
Und jetzt zur Zweiten zweile, hier taucht noch ein andere Bitoperator auf, der verschiebt die Bits um 12 Stellen nach rechts oder? Wie kann man das interpretieren? Ich hoffe ja das hier jemand irgendwelche Standarttricks oder irgendeinen Programierstil erkennent oder eine Konvention und mir erklären kann wieso man das gerade so macht und nicht anders. Manchmal gibt es ja verblüffend einfach und nachvollziehbare Erklärungen weshalb man gerade an dieser Stelle eine solche Bitweise Operation verwendet und das es völlig unnötig ist jetzt genau zu verstehen welches Bit welche Bedeutung hat.
-
Ok eins ist klar: 1&i würde dann entweder 1 oder 0 liefern d.h. es passt schon in dne Kontext einer if Abfrage, ist das eine gängige Praxis
Ja, sehr sehr gängige Praxis. Wie machst du denn selber deine if-Abfragen, wenn nicht so?
Hier wird übrigens geprüft ob das Bit ganz rechts gesetzt ist oder nicht.
Und jetzt zur Zweiten zweile, hier taucht noch ein andere Bitoperator auf, der verschiebt die Bits um 12 Stellen nach rechts oder?
Nein, andersrum. Die 0x0c wird um i Stellen nach rechts verschoben.
Manchmal gibt es ja verblüffend einfach und nachvollziehbare Erklärungen weshalb man gerade an dieser Stelle eine solche Bitweise Operation verwendet und das es völlig unnötig ist jetzt genau zu verstehen welches Bit welche Bedeutung hat.
Da deine Codeschnipsel völlig ohne Zusammenhang sind, kann man den Sinn als Leser nicht nachvollziehen. Oftmals macht man solche Bitspielereien, wenn man viele Schalter in einer Variable unterbringen möchte. Also statt 32 Variablen die nur An oder Aus signalisieren packt man alle diese Werte in eine einzige Zahl und hat dann deren Bits für die An oder Aus Information. Die Bitoperationen dienen dann dazu, diese Information zu setzen oder auszulesen.
-
Du hast natürlich recht das mein Beispiel ohne Zusammenhang daherkommen, ich hatte ja im Prinzip auf einen allgemeinere Aussage gehofft, eben weil das so schwer lesbar ist.
Und ich glaube ich bin selbst auf etwas gestossen:
if(1&(i))
du hast ja gesagt hier wird geprüft ob das Bit ganz rechts gesetzt ist (das habe ich auch so erkannt) aber das heist doch, dass die obige Abfrage immer genau dann Wahr ist/ausgeführt wird wenn i eine ungerade Zahl ist oder? (i ist natürlich ein Integer).
Ich habe das mal überprüft und es scheint so zu sein.
Wenn das stimmt, dann ist das schonmal sehr aufschlussreich und vermutlich die kompakteste Weise das zu prüfen, oder?
-
Ja, vor allem dürfte es schneller als das in diesem Fall unnötige Ausrechnen von i%2 sein.
An die Schreibweise gewöhnt man sich schnell. Bspw. kann du so überprüfen, ob ein Bit einer 32 bittigen Zahl gesetzt ist oder nicht:unsigned int val = /*ein Wert*/; char c[33]; c[32]=0; for(int i=0;i<32;++i) { // shiften um i-Stellen nach rechts, überprüfen ob das LSB gesetzt ist, schreiben von '1' oder '0' ins Array c[31-i]=((val>>i) & 1)?'1':'0'; } puts(c);