Ponieważ są to podstawowe operacje.
Na tej samej linii myślenia, można argumentować, że dodatek ma kilka zastosowań w świecie rzeczywistym, ponieważ może być zastąpiona całkowicie z odejmowaniem (i negacji) i mnożenia. Ale dodajemy, ponieważ jest to podstawowa operacja.
I nie myśl przez chwilę, że to, że nie widziałeś potrzeby operacji bitowych, nie oznacza, że nie są one używane zbyt często. Rzeczywiście, użyłem operacji bitowych w prawie każdym języku, którego użyłem do takich rzeczy jak maskowanie bitów.
Z góry głowy używałem operacji bitowych do przetwarzania obrazu, pól bitowych i flag, przetwarzania tekstu (np. Wszystkie znaki danej klasy często mają wspólny wzór bitowy), kodowania i dekodowania danych zserializowanych, dekodowania VM lub CPU kody operacyjne i tak dalej. Bez operacji bitowych większość z tych zadań wymagałaby wielokrotnie bardziej złożonych operacji, aby wykonać zadanie mniej niezawodnie lub ze słabszą czytelnością.
Na przykład:
// 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);
Dekodowanie instrukcji procesora dla procesorów typu RISC (na przykład podczas emulacji innej platformy) wymaga wyodrębnienia części o dużej wartości, jak wyżej. Czasami wykonywanie tych operacji z mnożeniem i dzieleniem i modulo itp. Może być nawet dziesięć razy wolniejsze niż równoważne operacje bitowe.