[C] bitwise operators

Kann mir bitte mal jemand verklickern wofür die bitwisen Operatoren und Bit-Shift genau gut sind?

&, |, >

Ich hab sie in letzter Zeit öfters in Programmen gesehen, allerdings nie ganz geblickt, was der Sinn dahinter is.
Wo kann einem sowas nützen bzw. was genau machen die Teile? (ihr könnt ruhig ins Detail gehen, mit dem Binärsystem etc. sollte ich mich inzw. auskennen :smile:

&, |, >

mit „|“ kanst du zum Beispiel bei einem Funktionsaufruf bei dem man mehere flags setzten kann die einzellnen von einnander trennen.
„>>“ und „>“ eine Eingabe einlesen.

Gruß Gerd

& : UND-Verknüpfung
| : ODER-Verknüpfung
>> ,> 1.
Dadurch werden alle bits um eine Stelle nach rechts verschoben, was einer Division durch 2^1 gleichkommt.Entsprechend x >> 2 für x/2^2 oder x [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Das is C++
Ich glaube du bist in der falschen Programmiersprache =:wink:

Ciao! Bjoern

Jep, soweit ist mir das bekannt.
Allerdings war mir mehr die Funktionsweise der Operator interessant und die ursprüngliche Arbeitsweise von >

mit „|“ kanst du zum Beispiel bei einem
Funktionsaufruf bei dem man mehere flags
setzten kann die einzellnen von einnander
trennen.
„>>“ und „>“
eine Eingabe einlesen.

Ah danke das habe ich verstanden :smile:
Allerdings ist mir nicht ganz klar wofür sowas gut sein soll, wo man das konkret braucht mit dem & und |
Hast du zufällig ein konkretes Beispiel Code an der Hand wo man den Sinn gut nachvollziehen kann? Gibt es eigentlich auch einen XOR-Operator?
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?

Danke Bru

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Mein erstes funktionierendes Beispiel
Wow :smile:
habe meine neuen Erkenntnisse von gestern in der Berufsakademie und eure Erklärungen gleich mal in C umgesetzt und es geht meine schnelle Multiplikation :smile:

int main(int argc, char\* argv[])
{
 long c = 0;
 int k = 460213;
 int l = 2542131;
 while (l != 0)
 {
 if (l & 1)
 {
 l--;
 c += k;
 }
 l \>\>= 1;
 k 

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.

int k = 460213;
int l = 2542131;

l >>= 1;
k

int k = 460213;
int l = 2542131;

l >>= 1;
k