Der Bitweise-OR-Operator verknüpft alle Bits zweier integraler Werte nach den Regeln des logischen OR: 0 OR 0 ergibt 0 und alle anderen Kombinationen ergeben 1.
#include <stdio.h>
void printbinary(int x){
char str[33]; str[32] = '\0';
int i = 32;
while(i){i--; str[i] = (x & 1) + '0'; x>>=1;}
printf("%s\n", str);
}
int main(){
int x = 1234567890;
int y = 987654321;
printbinary(x);
printbinary(y);
printbinary(x | y);
return 0;
}
Der Bitweise-OR-Operator erwartet zwei Operanden als rvalues und wird von links nach rechts abgearbeitet. Der Rückgabewert ist ein rvalue, der stets von integralem Typ ist.
Der Bitweise-OR-Operator ist nur für Integralwerte zulässig. Unter C++ ist zusätzlich auch die Anwendung des Operators auf boolsche Werte erlaubt, welche jedoch vor Anwendung des Operators in einen int umgewandelt werden.
Der Unterschied zwischen der bitweisen und der logischen Variante des OR-Operators ist für Einsteiger in die Sprache manchmal schwer verständlich. Der Unterschied ist: Die bitweise Variante verknüpft mehrere Bits von Werten, die logische Variante verknüpft 1-Bit-Werte. Selbst bei erfahrenen Programmierern kommt es vor, dass man aufgrund der ähnlichen Schreibweise (| oder ||) aus Versehen und ohne es zu merken den falschen Operatoren verwendet. Da zudem in gewissen Fällen die beiden Operatoren dieselben Ergebnisse liefern, ist dies eine schwer aufzufindende Fehlerquelle, die manchmal einige Stunden Fehlersuche benötigt.
Die bitweisen Operatoren NOT, AND, OR und XOR werden hauptsächlich für low-level Programmierung verwendet, wie beispielsweise in der Systemprogrammierung. Da sie einzelne Bits verändern, wird der Umgang mit diesen Operatoren auch häufig als Bit-fiddling (Bit-Schwindeleien, auch zu verstehen als Bit-Gebastel, oder auf gut Schweizerdeutsch: Umegfätterle mit Bittli) bezeichnet. Sie werden jedoch auch im normalen Programmieralltag verwendet, insbesondere, um sogenannte Masken zu bearbeiten. Masken sind Einstellungen, gespeichert als Folge von Bits, wobei jedes Bit eine Einstellung darstellt. Man nennt die einzelnen Bits auch Flags (Flaggen, Markierungen). Folgendes ist ein Beispiel von gängigen Maskenoperationen:
enum mask{
VALID = 0x01,
RUNNING = 0x02,
COMPUTING = 0x04,
ERROR = 0x08,
};
int main(){
enum mask m = VALID | RUNNING;
m |= COMPUTING;
m ^= ERROR;
if(m & ERROR) {printf("Error!\n");}
m &= ~VALID;
return 0;
}
0001
0010
0100
1000
Initializing with flags, m = 0011
Setting a flag, m = 0111
Switching a flag, m = 1111
Testing a flag 1111
deleting a flag, m = 1110
Überladen des Operators
Der Bitweise-OR-Operator hat grundsätzlich die semantische Bedeutung einer komponentenweisen boolschen OR-Verknüpfung. Allerdings ist auch jegliche andere Semantik vom Programmierer definierbar. Trotzdem sei angemerkt, dass der Bitweise-OR-Operator eher selten überladen wird.
Die Prototypen für das Überladen des Bitweise-OR-Operators sind die folgenden (Einschränkungen und Erläuterungen siehe Überladen von Operatoren):
Type operator |(Type);
Type operator |(Type) const;
Type operator |(Type, Type);
inside class
outside class
Im folgenden Beispiel wird eine Klasse für einen Bitstring mit 10 Zeichen präsentiert. Der überladene Bitweise-OR-Operator berechnet den entsprechenden Bitstring für eine OR-Verknüpfung.