Operator bitowy

operator realizujący podstawowe operacje algebry Boole’a

Operator bitowy w programowaniuoperator dostępny w określonym języku programowania (a także w innych językach komputerowych), który, działając na podanych argumentach, realizuje podstawowe operacje algebry Boole’a na pojedynczych bitach lub każdej parze odpowiadających sobie bitów pobieranych z tych samych pozycji dwóch argumentów operatora oraz operacje przesunięć lub obrotów bitowych.

To jakie operatory bitowe są dostępne w konkretnym języku programowania zależy od jego składni, a to jakie są zasady ich stosowania, w tym priorytet tych operatorów i kolejność opracowywania argumentów – od przyjętej przez autorów języka lub implementacji konwencji. Zróżnicowany jest również sposób zapisu operatorów bitowych w poszczególnych językach: stosuje się zapis w postaci słów kluczowych, bądź symboli (znaku lub znaków niebędących literami). Stosowane są operatory bitowe jednoargumentowe – operator negacji – oraz dwuargumentowe – np. suma logiczna, iloczyn logiczny i inne.

Dostępne operatory bitowe

Operatory bitowe udostępnione w językach komputerowych realizują następujące operacje bitowe:

Zapis operatorów bitowych

Jak wyżej zaznaczono zapis w kodzie źródłowym operatorów bitowych zależne jest od przyjętej w składni danego języka sposobu reprezentacji znakowej operatorów, przy czym stosowane są zasadniczo dwa rozwiązania:

  • zapis za pomocą słów kluczowych, odpowiadających nazwom operacji przez nie wykonywanych, np. and, or, xor, itp., takie rozwiązanie dostępne jest m.in. w języku Pascal[1], Visual Basic[2][3] i innych,
  • zapis za pomocą symboli składających się ze znaku lub znaków innych niż litery, np. &, |, itp. takie rozwiązanie dostępne jest m.in. w języku C[4][5][6], C++[6] i innych.

W językach programowania oprócz operatorów bitowych występują także i inne, w tym operatory logiczne, realizujące odpowiednie operacje logiczne na argumentach reprezentujących wartości logiczne: prawdy i fałszu. W pewnych językach, np. C[4][5][6], C++[6], zapis tych operatorów jest różny, np. dla iloczynu logicznego jest to symbol: &&, natomiast dla iloczynu bitowego jest to symbol: &. W innych językach stosowany jest jednolity zapis tych operatorów, a to czy realizowana jest operacja bitowa czy logiczna zależne jest od typu argumentów, tak jest m.in. w języku Pascal[1], np. iloczyn bitowy oraz iloczyn logiczny realizowany jest za pomocą operatora reprezentowanego przez słowo kluczowe: and, co stanowi tzw. przeciążanie operatorów.

Stosowanie operatorów bitowych

Operatory bitowe stosuje się w wyrażeniach, tak jak pozostałe operatory. Za pomocą operatorów bitowych można realizować niektóre obliczenia w sposób bardziej efektywny, szczególnie tam, gdzie optymalizacja wydajności kodu ma istotne znaczenie. Innym zastosowaniem operatorów bitowych jest badanie wybranej flagi (bitu) umieszczonej w rejestrze stanu (lub innych strukturach bitowych, takich jak np. wartości bitowego typu danych, zbiorowego typu danych lub wartości typu wyliczeniowego). Do badania takich flag stosuje się odpowiednie maski bitowe jako drugi argument wybranej operacji bitowej.

Przykłady
język programowaniaustawienie i badanie stanu określonej flagi
C[4][5][6]
# define MASKA_BIT_2=0H02;main() {   unsigned short bits;   /* instrukcje */   bits|=MASKA_BIT_2; /* ustawienie flagi - bit 2 */   /* instrukcje */   if (bits & MASKA_BIT_2) { /* badanie flagi - bit 2 */   /* instrukcje wykonywane, gdy      flaga - bit 2 - ustawiona */ } }
Pascal[1]
const MASKA_BIT_2=$02;var Bits : Byte;begin  { instrukcje }  Bits:=Bits or MASKA_BIT_2; { ustawienie flagi - bit 2 }  { instrukcje }  if (Bits and MASKA_BIT_2)=MASKA_BIT_2 then { badanie flagi - bit 2 }   begin     { instrukcje wykonywane, gdy       flaga - bit 2 - ustawiona }   endend.

Implementacja operatorów bitowych

Zagadnienie implementacji operatorów bitowych w językach komputerowych wiąże się jak wyżej zaznaczono z ustaleniem reguł ich stosowania obejmujących między innymi ich priorytet, łączność, zasady opracowywania argumentów, typy danych, które mogą być używane w operacjach bitowych i inne aspekty.

Z priorytetem operatorów bitowych wiąże się zagadnienie kolejności wykonywania obliczeń w wyrażeniach, co ma szczególne znaczenie przy budowaniu złożonych wyrażeń. Jeżeli priorytet operatorów bitowych jest wyższy niż innych operatorów, wykonywane są przed nimi. Oznacza to, że w tym przypadku, aby prawidłowo zbudować wyrażenie składające się z operacji arytmetycznych połączonych operatorem bitowych, niezbędne jest ujęcie poszczególnych operacji arytmetycznych łączonych operatorami bitowymi w nawiasy wymuszającymi określoną kolejność operacji. Ważne jest również ułożenie w hierarchii priorytetów operatorów operacji bitowych względem operatorów relacji przy budowaniu warunków badających stan określonej flagi w rejestrze flag realizowanych np. za pomocą określonej zmiennej typu całkowitoliczbowego. W przypadku wyższego priorytetu operatorów bitowych warunek z użyciem operatora porównania zostanie prawidłowo zrealizowany po operacji bitowej, w przeciwnym razie niezbędne jest ujęcie wyrażenia bitowego w nawiasach.

Operatory bitowe w językach programowania

Poniższe zestawienie zawiera dostępne operatory bitowe w wybranych językach komputerowych.

Operatory bitowe w językach komputerowych
język komputerowyjednoargumentowedwuargumentowe
negacjakoniunkcjaalternatywaalternatywa wykluczającaprzesunięcie bitoweinne
w prawow lewo
ABAP[7]BIT-NOTBIT-ANDBIT-ORBIT-XOR
Ada[8]
C[4][5][6], C++[6]~&|^>><<
Java[9]~&|^>><<>>>
Modula-2[10]NOTANDOR INCL, EXCL
Pascal[1]notandorxorshrshl
PL/I[11][12]¬&| ||
Python[13]~&|^>><<
REXX[14][15]
Visual Basic[2][3][16]NotAndOrXor>><<Imp, Eqv
Visual Basic for Applications[17]NotAndOrXor Imp, Eqv
VHDL[18]notandorxorslrsllnand, nxor, nor
sla, sra, rol, ror

Przypisy

Bibliografia

  • John E. Nicholls: Struktura języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, s. 294–295, seria: Informatyka. ISBN 83-204-0246-8. (pol.).