Co to są operatory bitowe?
W programie komputerowym operatory bitowe to operatory służące do manipulowania wzorcami bitowymi w wyrażeniach. Bitowe AND, OR, wyłączne OR (XOR), NOT, prawe przesunięcie i lewe przesunięcie są typowymi operacjami. Większość języków programowania komputerowego obejmuje wszystkie sześć tych operatorów. Są często używane do ustawiania, czyszczenia lub przerzucania pojedynczych bitów w programach sterujących sprzętem komputerowym. Operatory bitowe są również często używane w algorytmach szyfrowania i kompresji danych.
Typowe operatory bitowe są zwykle reprezentowane symbolicznie w językach programowania, takich jak C, C ++ i Java. Są one używane w wyrażeniach tak jak operatory arytmetyczne, takie jak znaki plus lub minus. Bitowy operator AND jest reprezentowany przez ampersand & , OR przez potok | i XOR z karetką ^ . NOT, znany również jako operator dopełniania, jest oznaczony tyldą ~ .
Prawy operator zmiany biegów stosuje podwójny kursor skierowany w prawo >> . Natomiast przesunięcie w lewo jest wskazywane przez podwójny kursor skierowany w lewo << . Java obejmuje kolejną operację przesunięcia w prawo, pokazaną z potrójnym kursorem >>> .
Operatory bitowe stosują operację logiczną do każdej pary bitów w operandach. NIE, przesunięcie w prawo i przesunięcie w lewo mają tylko jeden prawdziwy operand; drugą wartością operacji zmiany jest liczba bitów. Aby lepiej zrozumieć, jak działają operatory bitowe, jednostka może wizualizować swoje operandy jako liczby binarne. Na przykład operator dopełniacza odwraca każdy bit swojego pojedynczego operandu do stanu przeciwnego. Jeden staje się zerem, a zero staje się zerem. Uzupełnieniem 8-bitowej wartości binarnej 00110101 jest 11001010.
Operator AND ma dwa operandy. Krok po kroku logiczna operacja AND jest wykonywana przy użyciu jednego odpowiedniego bitu z każdego operandu. Wynik każdej operacji bitowej jest umieszczany w tej pozycji bitowej wyniku ogólnego. Na przykład operator AND przetworzy 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ć jednymi, aby wynik był jeden, w przeciwnym razie wynik wynosi zero. Na przykład, jeśli 8-bitowe wartości binarne argumentó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ł zerowy; w przeciwnym razie wynik jest jeden. Powszechnym zastosowaniem operatora OR jest ustawienie niektórych bitów wyniku na jedne. Odbywa się to poprzez umieszczenie ich w tych pozycjach bitów w jednym z operandów. W przypadku operacji XOR wynik wynosi zero, jeśli oba bity argumentu są zerowe lub jeśli oba bity argumentu są jednym - w przeciwnym razie wynikiem jest jeden.
Shift lewy i prawy przesuwają bity w operandzie w lewo lub w prawo o określoną liczbę pozycji bitów. Logiczne przesunięcie w prawo przesuwa zero w skrajnie lewy bit jako część przesunięcia. Arytmetyczne przesunięcie w prawo kopiuje bit najbardziej w lewo - bit znaku - przed przesunięciem do tej samej pozycji po przesunięciu. Oryginalny bit jest również przesuwany wraz z resztą. Każdy rodzaj przesunięcia w lewo przesuwa zero w skrajnie prawy bit.
Gdy operand jest przesunięty w prawo, najbardziej wysunięty w prawo kawałek przed zmianą jest po prostu wyrzucany. Podobnie, lewy bit przed przesunięciem w lewo jest usuwany. Nie zawija się na drugim końcu operandu.
Operacje przesunięcia bitowego zależą od języka i implementacji. Na przykład w C i C ++ >> i << wykonują przesunięcia logiczne, jeśli operand jest liczbą całkowitą bez znaku. Jeśli operandem jest liczba całkowita ze znakiem, prawdopodobne jest, że zamiast tego zostanie wykonane przesunięcie arytmetyczne. W Javie wszystkie operandy są uważane za podpisane, a przesunięcia arytmetyczne są zawsze wykonywane za pomocą >> i << . Operator >>> jest używany do logicznego przesunięcia w prawo, ale nadal można przypadkowo wykonać arytmetyczne przesunięcie w prawo bez ostrożnego rzutowania.
Komplikacje mogą również powstać, gdy operandy mają różne długości bitów lub gdy niektóre są podpisane, a niektóre są niepodpisane. Operatory bitowe i stałe liczbowe w środku wyrażenia złożonego mogą nie być oceniane zgodnie z oczekiwaniami. Należy zadbać o to, aby określić rozmiar i podpisany / niepodpisany charakter każdej ilości w wyrażeniu. Można tego dokonać poprzez staranne rzutowanie lub tymczasowe przypisywanie określonych typów zmiennych w kodzie programu.