Operacja bitowa - Bitwise operation

W programowania , A bitowe działanie działa na ciąg bitów , z tablicy bitów lub binarnej cyfrze (traktowana jako ciąg bitów), na poziomie jej pojedynczych bitów . Jest to szybka i prosta czynność, podstawowa dla operacji arytmetycznych wyższego poziomu i bezpośrednio obsługiwana przez procesor . Większość operacji bitowych jest przedstawianych jako instrukcje dwuargumentowe, w których wynik zastępuje jeden z argumentów wejściowych.

Na prostych, tanich procesorach operacje bitowe są zwykle znacznie szybsze niż dzielenie, kilka razy szybsze niż mnożenie, a czasem znacznie szybsze niż dodawanie. Podczas gdy współczesne procesory zwykle wykonują dodawanie i mnożenie tak samo szybko, jak operacje bitowe ze względu na dłuższe potoki instrukcji i inne opcje projektowania architektonicznego , operacje bitowe zwykle zużywają mniej energii ze względu na mniejsze zużycie zasobów.

Operatory bitowe

W poniższych wyjaśnieniach każde wskazanie pozycji bitu jest liczone od prawej (najmniej znaczącej) strony, przesuwając się w lewo. Na przykład wartość binarna 0001 (dziesiętna 1) ma zera na każdej pozycji oprócz pierwszej (tj. skrajnej prawej).

NIE

NIE bitowe lub uzupełnieniem , to jednoskładnikowa operacji , które wykonuje logicznej negacji na każdym kawałku, tworząc kod uzupełnień do jedności danej wartości binarnej. Bity, które mają wartość 0, stają się 1, a te, które mają wartość 1, stają się 0. Na przykład:

NOT 0111  (decimal 7)
  = 1000  (decimal 8)
NOT 10101011  (decimal 171)
  = 01010100  (decimal 84)

Uzupełnienie bitowe jest równe uzupełnieniu do dwóch wartości minus jeden. Jeśli używana jest arytmetyka uzupełnień do dwóch, to NOT x = -x − 1.

W przypadku liczb całkowitych bez znaku bitowe uzupełnienie liczby jest „odbiciem lustrzanym” liczby w połowie zakresu liczby całkowitej bez znaku. Na przykład dla 8-bitowych liczb całkowitych bez znaku NOT x = 255 - x, które można wizualizować na wykresie jako linię w dół, która skutecznie „odwraca” rosnący zakres od 0 do 255 do malejącego zakresu od 255 do 0. Prosty, ale ilustracyjny przykład zastosowania jest odwrócenie obrazu w skali szarości, w którym każdy piksel jest przechowywany jako liczba całkowita bez znaku.

ORAZ

Bitowe AND 4-bitowych liczb całkowitych

Bitowe I jest binarny działanie , które ma dwa jednakowej długości reprezentacji binarnych i wykonuje logicznego AND działanie na każdej parze odpowiednich bitów, co stanowi ich rośnie. Tak więc, jeśli oba bity w porównywanej pozycji mają wartość 1, bit w wynikowej reprezentacji binarnej to 1 (1 × 1 = 1); w przeciwnym razie wynik to 0 (1 × 0 = 0 i 0 × 0 = 0). Na przykład:

    0101 (decimal 5)
AND 0011 (decimal 3)
  = 0001 (decimal 1)

Operacja może być wykorzystana do określenia, czy określony bit jest ustawiony (1) czy wyczyszczony (0). Na przykład, mając wzorzec bitowy 0011 (dziesiętny 3), aby określić, czy drugi bit jest ustawiony, używamy bitowego AND ze wzorcem bitowym zawierającym 1 tylko w drugim bicie:

    0011 (decimal 3)
AND 0010 (decimal 2)
  = 0010 (decimal 2)

Ponieważ wynik 0010 jest niezerowy, wiemy, że ustawiony został drugi bit oryginalnego wzorca. Nazywa się to często maskowaniem bitów . (Przez analogię można użyć okładek taśmy maskującej lub masek , części, które nie powinny być zmieniane lub części, które nie są interesujące. W tym przypadku wartości 0 maskują bity, które nie są interesujące.)

Bitowe AND może być używane do usuwania wybranych bitów (lub flag ) rejestru, w którym każdy bit reprezentuje indywidualny stan logiczny . Ta technika jest wydajnym sposobem przechowywania wielu wartości logicznych przy użyciu jak najmniejszej ilości pamięci.

Na przykład 0110 (dziesiętne 6) można uznać za zestaw czterech flag, gdzie pierwsza i czwarta flaga są czyste (0), a druga i trzecia flaga są ustawione (1). Trzecia flaga może być wyczyszczona za pomocą bitowego AND ze wzorcem, który ma zero tylko w trzecim bicie:

    0110 (decimal 6)
AND 1011 (decimal 11)
  = 0010 (decimal 2)

Dzięki tej właściwości łatwo jest sprawdzić parzystość liczby binarnej, sprawdzając wartość najmniejszego bitu. Korzystając z powyższego przykładu:

    0110 (decimal 6)
AND 0001 (decimal 1)
  = 0000 (decimal 0)

Ponieważ 6 AND 1 to zero, 6 jest podzielne przez dwa, a zatem jest parzyste.

LUB

Bitowe OR 4-bitowych liczb całkowitych

Bitowe LUB jest binarny działanie , które ma dwa wzory bitowe równej długości wykonuje logiczny włącznie, albo działanie na każdej parze odpowiednich bitów. Wynik na każdej pozycji wynosi 0, jeśli oba bity są równe 0, w przeciwnym razie wynik wynosi 1. Na przykład:

   0101 (decimal 5)
OR 0011 (decimal 3)
 = 0111 (decimal 7)

Bitowe OR może być użyte do ustawienia na 1 wybranych bitów rejestru opisanego powyżej. Na przykład czwarty bit 0010 (dziesiętny 2) może być ustawiony przez wykonanie operacji bitowej OR ze wzorcem z ustawionym tylko czwartym bitem:

   0010 (decimal 2)
OR 1000 (decimal 8)
 = 1010 (decimal 10)

XOR

Bitowe XOR 4-bitowych liczb całkowitych

Bitowe XOR jest binarny działanie , które ma dwa wzory bitowe o jednakowej długości i wykonuje logiczny LUB wyłączne operacji na każdej parze odpowiednich bitów. Wynik na każdej pozycji wynosi 1, jeśli tylko jeden bit ma wartość 1, ale będzie równy 0, jeśli oba mają wartość 0 lub oba mają wartość 1. W tym przypadku dokonujemy porównania dwóch bitów, przy czym wartość 1 wynosi 1, jeśli te dwa bity są różne, i 0 jeśli są takie same. Na przykład:

    0101 (decimal 5)
XOR 0011 (decimal 3)
  = 0110 (decimal 6)

Bitowe XOR może być używane do odwracania wybranych bitów w rejestrze (zwane również przełączaniem lub odwracaniem). Dowolny bit może być przełączany przez XORowanie go wartością 1. Na przykład, biorąc pod uwagę wzorzec bitowy 0010 (dziesiętny 2), drugi i czwarty bit mogą być przełączane przez bitowe XOR ze wzorcem bitowym zawierającym 1 na drugiej i czwartej pozycji:

    0010 (decimal 2)
XOR 1010 (decimal 10)
  = 1000 (decimal 8)

Ta technika może być używana do manipulowania wzorcami bitowymi reprezentującymi zestawy stanów logicznych.

Zgromadzenie język programistów i optymalizujące kompilatory czasami używać XOR jako krótki-cut do ustawiania wartości w rejestrze do zera. Wykonywanie XOR na wartości przeciwko sobie zawsze daje zero, a na wielu architekturach ta operacja wymaga mniej cykli zegara i pamięci niż załadowanie wartości zerowej i zapisanie jej w rejestrze.

Jeśli zestaw ciągów bitów o stałej długości n (tj. słowa maszynowe ) jest uważany za n- wymiarową przestrzeń wektorową nad polem , to dodawanie wektorów odpowiada bitowemu XOR.

Matematyczne ekwiwalenty

Zakładając , dla nieujemnych liczb całkowitych, operacje bitowe można zapisać w następujący sposób:

Tabela prawdy dla wszystkich binarnych operatorów logicznych

Istnieje 16 możliwych funkcji prawdziwościowych dwóch zmiennych binarnych ; definiuje to tablicę prawdy .

Oto równoważne bitowo operacje dwóch bitów P i Q:

P Q F 0 NOR 1 Xq 2 ¬p 3 4 ¬q 5 XOR 6 NAND 7 I 8 XNOR 9 q 10 Jeśli/to 11 p 12 Wtedy/jeśli 13 LUB 14 T 15
1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

Odpowiedniki bitowe
0 NIE
(p LUB q)
(NIE p)
I q
NIE
p
p I
(NIE q)
NIE
q
p XOR q NIE
(p i q)
p AND q NIE
(p XOR q)
Q (NIE p)
LUB q
P p LUB
(NIE q)
p LUB q 1

Przesunięcia bitowe

Do bit zmiany są czasem uznawane bitowe operacje, ponieważ traktują wartość jako ciąg bitów, a nie jako ilość numerycznej. W tych operacjach cyfry są przesuwane lub przesuwane w lewo lub w prawo. Rejestry w procesorze komputerowym mają stałą szerokość, więc niektóre bity zostaną „przesunięte” z rejestru na jednym końcu, podczas gdy ta sama liczba bitów zostanie „przesunięta” z drugiego końca; różnice między operatorami przesunięcia bitowego polegają na tym, jak określają wartości przesuniętych bitów.

Adresowanie bitowe

Jeśli szerokość rejestru (często 32 lub nawet 64) jest większa niż liczba bitów (zwykle 8) najmniejszej jednostki adresowalnej (element atomowy), często nazywanej bajtem, operacje przesunięcia indukują schemat adresowania od bajtów do bity. W ten sposób orientacje „w lewo” i „w prawo” są pobierane ze standardowego zapisu liczb w zapisie wartości miejsc , tak że przesunięcie w lewo zwiększa się, a przesunięcie w prawo zmniejsza wartość liczby ― jeśli najpierw odczyta się lewe cyfry to tworzy orientację big-endian . Pomijając efekty brzegowe na obu końcach rejestru, operacje arytmetyczne i logiczne przesunięcia zachowują się tak samo, a przesunięcie o 8 pozycji bitowych przenosi wzór bitowy o 1 bajtową pozycję w następujący sposób:

przesunięcie w lewo o 8 pozycji zwiększa adres bajtu o 1
  • Zamawianie Little-endian:
przesunięcie w prawo o 8 pozycji zmniejsza adres bajtu o 1
przesunięcie w lewo o 8 pozycji zmniejsza adres bajtu o 1
  • Zamawianie big-endian:
przesunięcie w prawo o 8 pozycji zwiększa adres bajtu o 1

Przesunięcie arytmetyczne

Przesunięcie arytmetyczne w lewo
Przesunięcie arytmetyczne w prawo

W przesunięciu arytmetycznym bity, które są przesunięte z dowolnego końca, są odrzucane. W lewostronnym przesunięciu arytmetycznym zera są przesuwane w prawo; przy przesunięciu arytmetycznym w prawo, bit znaku (MSB w uzupełnieniu do dwójki) jest przesuwany w lewo, zachowując w ten sposób znak operandu.

Ten przykład używa rejestru 8-bitowego, interpretowanego jako uzupełnienie do dwóch:

   00010111 (decimal +23) LEFT-SHIFT
=  00101110 (decimal +46)
   10010111 (decimal −105) RIGHT-SHIFT
=  11001011 (decimal −53)

W pierwszym przypadku skrajna lewa cyfra została przesunięta poza koniec rejestru, a nowe 0 zostało przesunięte w skrajną prawą pozycję. W drugim przypadku, skrajna prawa 1 została przesunięta (być może do flagi przeniesienia ), a nowa 1 została skopiowana na skrajną lewą pozycję, zachowując znak liczby. Wielokrotne zmiany są czasami skracane do jednej zmiany o pewną liczbę cyfr. Na przykład:

   00010111 (decimal +23) LEFT-SHIFT-BY-TWO
=  01011100 (decimal +92)

W lewej arytmetyczną przejścia przez n jest równoważna mnożenie przez 2 n (pod warunkiem, że wartość nie przelewowy ), podczas gdy prawa arytmetyczna przesunięte o n o danej uzupełnienie dwójkowe wartości jest równoważne biorąc podłogi dzielenia przez 2 n . Jeśli liczba binarna jest traktowana jako uzupełnienie do jedynek , to ta sama operacja przesunięcia w prawo powoduje dzielenie przez 2 n i zaokrąglanie do zera .

Przesunięcie logiczne

Przesunięcie logiczne w lewo
Prawe przesunięcie logiczne

W przesunięciu logicznym zera są przesuwane w celu zastąpienia odrzuconych bitów. Dlatego logiczne i arytmetyczne przesunięcia w lewo są dokładnie takie same.

Jednak, jak logiczne wkładki prawy shift wartość 0 bity w najbardziej znaczącego bitu, zamiast kopiowania bit znaku, jest idealnym miejscem dla niepodpisanych liczb binarnych, natomiast arytmetyka prawy shift jest idealny dla podpisanych dopełniacza na dwóch liczb binarnych.

Przesunięcie kołowe

Inną formą przesunięcia jest przesunięcie kołowe , obrót bitowy lub obrót bitowy .

Obracać się

Przesuń lub obróć w lewo okrężne
Przesunięcie lub obrót w prawo okrężne

W tej operacji, czasami nazywanej rotate no carry , bity są „obracane” tak, jakby lewy i prawy koniec rejestru były połączone. Wartość, która jest przesunięta w prawo podczas operacji przesunięcia w lewo, to wartość, która została przesunięta w lewo i na odwrót w przypadku operacji przesunięcia w prawo. Jest to przydatne, jeśli konieczne jest zachowanie wszystkich istniejących bitów i jest często używane w kryptografii cyfrowej .

Obróć przez przeniesienie

Obróć w lewo przez przeniesienie
Obróć w prawo przez przeniesienie

Obróć przez przeniesienie jest wariantem operacji obracania, w której bit, który jest przesuwany (na każdym końcu) jest starą wartością flagi przeniesienia, a bit, który jest przesuwany (na drugim końcu) staje się nową wartością flaga przenoszenia.

Pojedynczy obrót przez przeniesienie może symulować logiczne lub arytmetyczne przesunięcie jednej pozycji poprzez wcześniejsze ustawienie flagi przeniesienia. Na przykład, jeśli flaga przeniesienia zawiera 0, to x RIGHT-ROTATE-THROUGH-CARRY-BY-ONEjest logicznym przesunięciem w prawo, a jeśli flaga przeniesienia zawiera kopię bitu znaku, to x RIGHT-ROTATE-THROUGH-CARRY-BY-ONEjest to arytmetyczne przesunięcie w prawo. Z tego powodu niektóre mikrokontrolery, takie jak low-end PIC, po prostu obracają się i obracają przez przeniesienie i nie zawracają sobie głowy instrukcjami arytmetycznymi lub logicznymi przesunięciami.

Rotate through carry jest szczególnie przydatne podczas wykonywania przesunięć na liczbach większych niż natywny rozmiar słowa procesora , ponieważ jeśli duża liczba jest przechowywana w dwóch rejestrach, bit, który jest przesunięty z jednego końca pierwszego rejestru, musi wejść na drugi koniec drugi. Przy obrocie przez przeniesienie ten bit jest „zapisywany” we fladze przeniesienia podczas pierwszej zmiany, gotowy do przesunięcia podczas drugiej zmiany bez żadnych dodatkowych przygotowań.

W językach wysokiego poziomu

Rodzina C

W językach z rodziny C operatory logicznego przesunięcia to " <<" dla przesunięcia w lewo i " >>" dla przesunięcia w prawo. Liczba miejsc do przesunięcia jest podana jako drugi argument operatora. Na przykład,

x = y << 2;

przypisuje xwynik przesunięcia yw lewo o dwa bity, co odpowiada mnożeniu przez cztery.

Przesunięcia mogą skutkować zachowaniem zdefiniowanym przez implementację lub zachowaniem niezdefiniowanym , dlatego należy zachować ostrożność podczas ich używania. Wynikiem przesunięcia o liczbę bitów większą lub równą rozmiarowi słowa jest niezdefiniowane zachowanie w C i C++. Przesunięcie wartości ujemnej w prawo jest zdefiniowane przez implementację i nie jest zalecane przez dobrą praktykę kodowania; wynik przesunięcia w lewo wartości ze znakiem jest niezdefiniowany, jeśli wynik nie może być reprezentowany w typie wyniku.

W C# przesunięcie w prawo jest przesunięciem arytmetycznym, gdy pierwszy operand jest int lub long. Jeśli pierwszy operand jest typu uint lub ulong, przesunięcie w prawo jest przesunięciem logicznym.

Zmiany kołowe

W rodzinie języków C brakuje operatora rotacji (chociaż C++20 zapewnia std::rotli std::rotr), ale można go zsyntetyzować z operatorów zmiany. Należy zadbać o to, aby oświadczenie było dobrze sformułowane, aby uniknąć niezdefiniowanych zachowań i ataków w czasie w oprogramowaniu o wymaganiach bezpieczeństwa. Na przykład naiwna implementacja, która w lewo obraca 32-bitową wartość bez znaku xwedług npozycji, to po prostu:

uint32_t x = ..., n = ...;
uint32_t y = (x << n) | (x >> (32 - n));

Jednak przesunięcie o 0bity skutkuje niezdefiniowanym zachowaniem w wyrażeniu po prawej stronie, (x >> (32 - n))ponieważ 32 - 0jest 32i 32jest poza zakresem [0 - 31]włącznie. Druga próba może skutkować:

uint32_t x = ..., n = ...;
uint32_t y = n ? (x << n) | (x >> (32 - n)) : x;

gdzie wielkość zmiany jest testowana, aby upewnić się, że nie wprowadza nieokreślonego zachowania. Jednak gałąź dodaje dodatkową ścieżkę kodu i stanowi okazję do analizy czasowej i ataku, co często jest niedopuszczalne w oprogramowaniu o wysokiej integralności. Ponadto kod kompiluje się do wielu instrukcji maszynowych, co często jest mniej wydajne niż natywne instrukcje procesora.

Aby uniknąć niezdefiniowanego zachowania i gałęzi w GCC i Clang, zalecane jest wykonanie następujących czynności. Wzorzec jest rozpoznawany przez wiele kompilatorów i kompilator wyemituje pojedynczą instrukcję obracania:

uint32_t x = ..., n = ...;
uint32_t y = (x << n) | (x >> (-n & 31));

Istnieją również mechanizmy wewnętrzne specyficzne dla kompilatora implementujące przesunięcia kołowe , takie jak _rotl8, _rotl16 , _rotr8, _rotr16 w Microsoft Visual C++ . Clang zapewnia pewne wewnętrzne funkcje rotacji w celu zapewnienia zgodności z Microsoft, w przypadku których występują powyższe problemy. GCC nie oferuje rotacji wewnętrznej. Intel dostarcza również moduły wewnętrzne x86 .

Jawa

W Javie wszystkie typy liczb całkowitych są ze znakiem, więc operatory „ <<” i „ >>” wykonują przesunięcia arytmetyczne. Java dodaje operator " >>>" w celu wykonania logicznego przesunięcia w prawo, ale ponieważ logiczne i arytmetyczne operacje przesunięcia w lewo są identyczne dla liczby całkowitej ze znakiem, <<<w Javie nie ma operatora " ".

Więcej szczegółów na temat operatorów zmiany Java:

  • Operatory <<(przesunięcie w lewo), >>(zmiana w prawo ze znakiem) i >>>(zmiana w prawo bez znaku) są nazywane operatorami zmiany .
  • Typ wyrażenia shift jest promowanym typem operandu po lewej stronie. Na przykład aByte >>> 2jest równoważne .((int) aByte) >>> 2
  • Jeżeli promowanym typem lewego operandu jest int, tylko pięć bitów najniższego rzędu prawego operandu jest używanych jako odległość przesunięcia. To tak, jakby prawy operand był poddany bitowemu operatorowi logicznemu AND & o wartości maski 0x1f (0b11111). Rzeczywista odległość zmiany biegów jest zatem zawsze w zakresie od 0 do 31 włącznie.
  • Jeśli promowany typ lewego operandu jest długi, to tylko sześć bitów najniższego rzędu prawego operandu jest używanych jako odległość przesunięcia. To tak, jakby prawy operand został poddany bitowemu operatorowi logicznemu AND & o wartości maski 0x3f (0b111111). Rzeczywista odległość zmiany biegów jest zatem zawsze w zakresie od 0 do 63 włącznie.
  • Wartość n >>> sto n przesuniętych w prawo s pozycji bitowych z zerowym rozszerzeniem.
  • W operacjach bitowych i przesunięcia typ bytejest niejawnie konwertowany na int. Jeśli wartość bajtu jest ujemna, najwyższy bit to jeden, wtedy jedynki są używane do wypełnienia dodatkowych bajtów w int. Tak spowoduje .byte b1 = -5; int i = b1 | 0x0200;i == -5

JavaScript

JavaScript używa operacji bitowych do oceny każdej z dwóch lub więcej jednostek na 1 lub 0.

Pascal

W Pascalu, jak również we wszystkich jego dialektach (takich jak Object Pascal i Standard Pascal ), logiczne operatory przesunięcia w lewo i w prawo to odpowiednio " shl" i " shr". Nawet dla liczb całkowitych shrze znakiem zachowuje się jak przesunięcie logiczne i nie kopiuje bitu znaku. Liczba miejsc do przesunięcia jest podana jako drugi argument. Na przykład poniższe przypisuje x wynik przesunięcia y w lewo o dwa bity:

x := y shl 2;

Inne

Aplikacje

Operacje bitowe są niezbędne zwłaszcza w programowaniu niższego poziomu, takim jak sterowniki urządzeń, grafika niskiego poziomu, składanie pakietów protokołu komunikacyjnego i dekodowanie.

Chociaż maszyny często mają wydajne wbudowane instrukcje do wykonywania operacji arytmetycznych i logicznych, wszystkie te operacje można wykonać, łącząc na różne sposoby operatory bitowe i testowanie zerowe. Na przykład, oto implementacja pseudokodu starożytnego egipskiego mnożenia pokazująca, jak pomnożyć dwie dowolne liczby całkowite ai b( awiększe od b) przy użyciu tylko przesunięć bitowych i dodawania:

c  0
while b  0
    if (b and 1)  0
        c  c + a
    left shift a by 1
    right shift b by 1
return c

Innym przykładem jest implementacja dodawania w pseudokodzie, pokazująca, jak obliczyć sumę dwóch liczb całkowitych ai bużywając operatorów bitowych oraz testowania zerowego:

while a  0
    c  b and a
    b  b xor a
    left shift c by 1
    a  c
return b

Algebra Boole'a

Czasami przydatne jest uproszczenie złożonych wyrażeń składających się z operacji bitowych. Na przykład podczas pisania kompilatorów. Celem kompilatora jest przetłumaczenie języka programowania wysokiego poziomu na możliwie najbardziej wydajny kod maszynowy . Algebra Boole'a służy do uproszczenia złożonych wyrażeń bitowych.

ORAZ

  • x & y = y & x
  • x & (y & z) = (x & y) & z
  • x & 0xFFFF = x
  • x & 0 = 0
  • x & x = x

LUB

  • x | y = y | x
  • x | (y | z) = (x | y) | z
  • x | 0 = x
  • x | 0xFFFF = 0xFFFF
  • x | x = x

NIE

  • ~(~x) = x

XOR

  • x ^ y = y ^ x
  • x ^ (y ^ z) = (x ^ y) ^ z
  • x ^ 0 = x
  • x ^ y ^ y = x
  • x ^ x = 0
  • x ^ 0xFFFF = ~x

Dodatkowo XOR można składać za pomocą 3 podstawowych operacji (AND, OR, NOT)

  • a ^ b = (a | b) & (~a | ~b)
  • a ^ b = (a & ~b) | (~a & b)

Inni

  • x | (x & y) = x
  • x & (x | y) = x
  • ~(x | y) = ~x & ~y
  • ~(x & y) = ~x | ~y
  • x | (y & z) = (x | y) & (x | z)
  • x & (y | z) = (x & y) | (x & z)
  • x & (y ^ z) = (x & y) ^ (x & z)
  • x + y = (x ^ y) + ((x & y) << 1)
  • x - y = ~(~x + y)

Odwrotność i rozwiązywanie równań

Może być trudno znaleźć zmienne w algebrze Boole'a, ponieważ w przeciwieństwie do zwykłej algebry, kilka operacji nie ma odwrotności. Operacje bez odwrotności tracą część oryginalnych bitów danych podczas ich wykonywania i nie jest możliwe odzyskanie tych brakujących informacji.

  • Ma odwrotność
    • NIE
    • XOR
    • Obrót w lewo
    • Obróć w prawo
  • Brak odwrotności
    • ORAZ
    • LUB
    • Przesuń w lewo
    • Przesuń w prawo

Kolejność operacji

Operacje na górze tej listy są wykonywane jako pierwsze. Zobacz główny artykuł, aby uzyskać pełniejszą listę.

  • ( )
  • ~ -
  • * / %
  • + -
  • << >>
  • &
  • ^
  • |

Zobacz też

Bibliografia

Zewnętrzne linki