Allerdings ist mir nicht ganz klar wofür
sowas gut sein soll, wo man das konkret
braucht mit dem & und |
Für Optimiererfreaks ist das das A und O.
Es sind sehr elementare Operationen, die unmittelbar die Arbeit des Prozessors abbilden (Prozessoren können sowas eh, da diese operationen sehr leicht in Hardware implementiert werden).
Hast du zufällig ein konkretes Beispiel
Code an der Hand wo man den Sinn gut
nachvollziehen kann?
Ich hatte mal die Aufgabe, einen Zähler zu bauen, der von 0 bis 7 zählte und dann wieder bei 0 anfing in einer Art Endlosschleife. Das ging natürlich so:
int i=0;
while(1)
{
++i;
if(i = 8)
i = 0;
tue_etwas;
}
Mit dem binären & kannst Du die Abfrage verkürzen:
int i=0;
while(1)
{
i = ++i & 7;
/* Behalte nur die unteren 3 Bits */
/* d.h. aus 8 = 1000 = 000 */
/* bei kleiner 8 bleibt i gleich */
tue_etwas;
}
Ein spezielles Beispiel, aber anschaulich.
Solche Sachen werden z.B. in Unix verwendet, um Berechtigungen zu prüfen (Wenn Bit x gesetzt ist, darf Benutzer Aktion starten. Die Bitmaske ist die ihm zugewiesene Berechtigung).
Gibt es eigentlich
auch einen XOR-Operator?
XOR gibt es auch: ^
c = a^b;
Gehen beim Shifting Daten verloren? Wenn
ich z.b. ein Integer um zwei nach links
shift, häng ich ja zwei Nullen an, aber
wenn ich nach rechts shifte gehen die
zwei letzten Stellen verloren?
Genau so ist das.
Beim Linksschieben übrigens auch, je nach Datentyp verschwindet das signifikanteste Bit beim Überschreiten der Bitgröße (kann zu sehr netten Nebeneffekten führen).
Gruß
J.