Nach der theoretischen Erklärung der Bit-Operatoren mal ein etwas praktischer Einschub.

Wie gesagt verbinden sie bitweise zwei Variablen miteinander. Ein boolscher Ausdruck, der in einem If abgefragt wird, ist im Grunde genau ein Bit. Entweder ergibt er TRUE (1) oder False (0). Mithilfe der boolschen Operatoren OR (|), AND (&) und NOT (!), kann man jetzt zwei oderer mehrer dieser Ausdrücke verbinden und erhält als Ergebnis wieder einen einfachen boolschen Ausdruck.

Beispiel:
Code:
// Wir wollen, daß etwas passiert wenn zwei Variablen jeweils einen bestimmten Wert haben
// Version ohne boolsche Operatoren:
if (x == 5) {
if (y == 3) {
 // Hier Code
}
}

// Version mit boolschen Operatoren
if (x == 5) & (y == 3) {
 // Hier Code
}
Wir haben uns ein zusätzliches if gespart und damit insgesamt zwei Zeilen. Auf diesselbe Art kann man das OR (|) benutzen, dann ergibt der Gesamtausdruck TRUE, sobald eines der beiden mit OR verknüpften Glieder TRUE ergibt.
NOT läßt sich wie gesagt auf einen Ausdruck anwenden und ergibt TRUE, wenn der Ausdruck selber FALSE ergibt.
Diese drei Operatoren lassen sich natürlich auch beliebig, mithilfe von Klammern, kombinieren.
Code:
if ((x < 0) | (y < 0)) & !(tuEtwas) {
// Code..
}
Allgemein lässt sich mit diesen Operatoren sehr oft Schreibarbeit einsparen, insbesondere bei Abfragen mehrer zusammenhängender Ausdrücke, die man dann alle in ein if reinpacken kann.

Neben der Anwendung in ifs, lassen diese Ausdrücke sich natürlich auch benutzen um direkt bitweise mit Werten zu arbeiten, das kommt in der Regel aber seltener vor. Sehr verbreitet ist dabei aber die Methode mithilfe des OR, bitweise Flags von irgendwelchen Libarys zu verknüpfen.
Code:
ichBinEineFunktion(var1, var2, FLAG1 | FLAG2);
Wenn FLAG1 jetzt die Zahl 01 ist und FLAG2 die Zahl 10, wird der Funktion die OR-Verknüpfung beider Zahlen übergeben, in diesem Fall 11. Mithilfe von AND und NOT, kann die Funktion dann überprüfen ob ein bestimmtes Bit, und damit ein bestimmtes Flag, gesetzt ist und entsprechend reagieren.
Code:
if !(flags & 0x2) { // 0x2 müßte in Binär 10 sein
// FLAG2 ist gesetzt
}
if !(flags & 0x1) { // 0x1 müßte in Binär 01 sein
// FLAG1 ist gesetzt
}
Dadurch kann man einer Funktion eine Vielzahl von An- und Ausschaltbaren Optionen beibringen, ohne den Funktionsaufruf durch unzählige weitere Argumente zu überladen, weil die Flags zusammen nur als 1 Wert übergeben werden.