Czym są operatory bitowe?

W programie komputerowym operatory bitowe są operatorami do manipulowania wzorcami bitowymi w wyrażeniach. Bitowe AND, OR, wykluczające OR (XOR), NOT, przesunięcie w prawo i przesunięcie w lewo są typowymi operacjami. Większość języków programowania komputerów zawiera wszystkie sześć tych operatorów. Są one często używane do ustawiania, czyszczenia lub odwracania poszczególnych bitów w programach sterujących sprzętem komputerowym. Operatory bitowe są również często używane w algorytmach szyfrowania i kompresji danych.

Popularne operatory bitowe są zwykle przedstawiane symbolicznie w językach programowania, takich jak C, C++ i Java. Są one używane w wyrażeniach, tak jak byłyby operatory arytmetyczne, takie jak znaki plus lub minus. Operator bitowy AND jest reprezentowany przez znak &, OR przez potok | i XOR z daszek ^. NOT, znany również jako operator dopełnienia, jest oznaczony tyldą ~.

Operator zmiany prawej używa podwójnej karetki wskazującej w prawo >>. W przeciwieństwie do tego przesunięcie w lewo jest wskazywane przez skierowaną w lewo podwójną karetkę . Java zawiera inną operację przesunięcia w prawo, pokazaną za pomocą potrójnej karetki skierowanej w prawo >>>.

Operatory bitowe stosują operację logiczną do każdej pary bitów w ich operandach. NIE, przesunięcie w prawo i przesunięcie w lewo mają tylko jeden prawdziwy operand; druga wartość w operacjach przesunięcia to liczba bitów. Aby lepiej zrozumieć, jak działają operatory bitowe, osoba może wizualizować swoje operandy jako liczby binarne. Na przykład operator dopełnienia odwraca każdy bit swojego pojedynczego operandu do stanu przeciwnego. Jedynka staje się zerem, a zero staje się jedynką. Uzupełnieniem 8-bitowej wartości binarnej 00110101 jest 11001010.

Operator AND ma dwa argumenty. Bit po bicie, operacja logiczna AND jest wykonywana przy użyciu jednego odpowiedniego bitu z każdego operandu. Wynik każdej operacji bitowej jest umieszczany na tej pozycji bitowej wyniku ogólnego. Na przykład operator AND będzie przetwarzać bit 7 jednego operandu z bitem 7 drugiego operandu. Wynik zostanie zapisany w bicie 7 wyniku ogólnego.

W operacji AND oba bity operandu muszą być jedynkami, aby wynik był jeden, w przeciwnym razie wynik jest równy zero. Na przykład, jeśli 8-bitowe wartości binarne operandów to 00110101 i 11110000, wynikiem będzie 00110000. Powszechnym zastosowaniem operatora AND jest wyzerowanie poszczególnych bitów w wyniku. Odbywa się to poprzez umieszczenie zer w tych pozycjach bitów w jednym z operandów.
W operacji OR oba bity operandu muszą być zerami, aby wynik był zerem; w przeciwnym razie wynik jest jeden. Powszechnym zastosowaniem operatora OR jest ustawienie niektórych bitów wyniku na jedynki. Odbywa się to poprzez umieszczenie jedynek w tych pozycjach bitowych w jednym z operandów. W przypadku operacji XOR wynikiem jest zero, jeśli oba bity operandu są zerowe lub jeśli oba bity operandu są jedynką — w przeciwnym razie wynikiem jest jeden.
Przesunięcie w lewo i przesunięcie w prawo przesuwają bity operandu w lewo lub w prawo o określoną liczbę pozycji bitowych. Logiczne przesunięcie w prawo przesuwa zero do skrajnego lewego bitu jako część przesunięcia. Arytmetyczne przesunięcie w prawo kopiuje skrajny lewy bit — bit znaku — przed przesunięciem do tej samej pozycji po przesunięciu. Pierwotny bit jest również przesunięty w prawo wraz z resztą. Każdy rodzaj przesunięcia w lewo przesuwa zero do skrajnego prawego bitu.
Kiedy operand jest przesunięty w prawo, najbardziej w prawo bit przed przesunięciem jest po prostu odrzucany. Podobnie usuwany jest skrajny lewy bit przed przesunięciem w lewo. Nie zawija się na drugi koniec operandu.
Operacje przesunięcia bitowego są zależne od języka i implementacji. Na przykład w C i C++ >> i wykonaj logiczne przesunięcia, jeśli operand jest liczbą całkowitą bez znaku. Jeśli operand jest liczbą całkowitą ze znakiem, prawdopodobnie zamiast tego zostanie wykonane przesunięcie arytmetyczne. W Javie wszystkie operandy są uważane za ze znakiem, a przesunięcia arytmetyczne są zawsze wykonywane za pomocą >> i . Operator >>> jest używany do logicznego przesunięcia w prawo, ale nadal możliwe jest przypadkowe wykonanie arytmetycznego przesunięcia w prawo bez starannego rzutowania typów.
Komplikacje mogą również wystąpić, gdy operandy mają różne długości bitów lub gdy niektóre są ze znakiem, a inne bez znaku. Operatory bitowe i stałe numeryczne w środku wyrażenia złożonego mogą nie być oceniane zgodnie z oczekiwaniami. Należy zadbać o określenie rozmiaru i podpisanego/niepodpisanego charakteru każdej ilości w wyrażeniu. Można to zrobić za pomocą ostrożnego rzutowania typów lub tymczasowego przypisania do określonych typów zmiennych w kodzie programu.