Weil sie grundlegende Operationen sind.
Mit der gleichen Überlegung könnte man argumentieren, dass Addition nur wenige reale Verwendungen hat, da sie vollständig durch Subtraktion (und Negation) und Multiplikation ersetzt werden kann. Aber wir behalten die Ergänzung bei, weil es eine grundlegende Operation ist.
Und denken Sie nicht einen Moment, dass nur, weil Sie nicht viel Bedarf an bitweisen Operationen gesehen haben, dies nicht bedeutet, dass sie nicht sehr oft verwendet werden. In der Tat habe ich bitweise Operationen in fast jeder Sprache verwendet, die ich für Dinge wie Bitmaskierung verwendet habe.
Ich verwende bitweise Operationen für die Bildverarbeitung, für Bitfelder und Flags, für die Textverarbeitung (z. B. alle Zeichen einer bestimmten Klasse haben häufig ein gemeinsames Bitmuster), für die Codierung und Decodierung serialisierter Daten, für die Decodierung von VMs oder CPUs Opcodes und so weiter. Ohne bitweise Operationen würden die meisten dieser Aufgaben viel komplexere Operationen erfordern, um die Aufgabe weniger zuverlässig oder mit schlechterer Lesbarkeit auszuführen.
Beispielsweise:
// Given a 30-bit RGB color value as a 32-bit int
// A lot of image sensors spit out 10- or 12-bit data
// and some LVDS panels have a 10- or 12-bit format
b = (color & 0x000003ff);
g = (color & 0x000ffc00) >> 10;
r = (color & 0x3ff00000) >> 20;
// Going the other way:
color = ((r << 20) & 0x3ff00000) | ((g << 10) & 0x000ffc00) | (b & 0x000003ff);
Das Dekodieren von CPU-Anweisungen für RISC-CPUs (z. B. beim Emulieren einer anderen Plattform) erfordert das Extrahieren von Teilen mit einem großen Wert wie oben. Manchmal kann die Ausführung dieser Operationen mit Multiplikation und Division und Modulo usw. bis zu zehnmal langsamer sein als die entsprechenden bitweisen Operationen.