Operator bitowy

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 }
   end
end.

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-XORNNN
Ada[8]NNNNNNN
C[4][5][6], C++[6]~&|^>><<N
Java[9]~&|^>><<>>>
Modula-2[10]NOTANDORNNNINCL, EXCL
Pascal[1]notandorxorshrshlN
PL/I[11][12]¬&|NNN||
Python[13]~&|^>><<N
REXX[14][15]NNNNNNN
Visual Basic[2][3][16]NotAndOrXor>><<Imp, Eqv
Visual Basic for Applications[17]NotAndOrXorNNImp, Eqv
VHDL[18]notandorxorslrsllnand, nxor, nor
sla, sra, rol, ror

Przypisy

  1. a b c d Andrzej Marciniak: Borland Pascal 7.0. Poznań: Nakom, 1994, seria: Biblioteka Użytkownika Mikrokomputerów. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.).
  2. a b Logical/Bitwise Operators (Visual Basic). msdn.microsoft.com. [dostęp 2011-09-08]. (ang.).
  3. a b Logical and Bitwise Operators in Visual Basic. msdn.microsoft.com. [dostęp 2011-09-08]. (ang.).
  4. a b c d Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.).
  5. a b c d Jan Bielecki: Encyklopedia języka C dla IBM PC. T. I: Opis języka. Warszawa: Wydawnictwa Komunikacji i Łączności, 1989. ISBN 83-206-0919-4. (pol.).
  6. a b c d e f g Jan Bielecki: Od C do C++, programowanie obiektowe w języku C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990. ISBN 83-204-1332-X. (pol.).
  7. Bit Operations. [w:] ABAP Programming (BC-ABA) [on-line]. help.sap.com – SAP Library. [dostęp 2011-09-08]. (ang.).
  8. Michał Morawski, Antoni M. Zajączkowski: Wstęp do programowania w języku Ada’95. Wyd. drugie. Łódź: 2004. [dostęp 2011-01-29]. (pol.).
  9. Artur Tyloch: Kurs Java. Opis języka, składni. Polski podręcznik.. www.webdeveloper.pl. [dostęp 2011-09-08]. (pol.).
  10. Niklaus Wirth: Modula 2. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-0828-8. ISSN 0867-6011. (pol.).
  11. Jan Bielecki: Rozszerzony PL/I i JCL w systemie OS/RIAD. Warszawa: Państwowe Wydawnictwo Naukowe, 1986, seria: Biblioteka Informatyki. ISBN 83-01-06146-4. (pol.).
  12. M. I. Auguston i inni: Programowanie w języku PL/1 OS JS. Warszawa: Państwowe Wydawnictwo Naukowe, 1988. ISBN 83-01-07463-9. (pol.).
  13. The Python Language Reference 2.7. docs.python.org, August 04, 2011. [dostęp 2011-09-27]. (ang.).
  14. The REXX language. killbox.pl. [dostęp 2011-09-08]. [zarchiwizowane z tego adresu (2016-03-04)]. (ang.).
  15. Open Object Rexx™: Reference. www.oorexx.org. [dostęp 2011-09-08]. (ang.).
  16. Bit Shift Operators (Visual Basic). msdn.microsoft.com. [dostęp 2011-09-26]. (ang.).
  17. John Walkenbach: Excel 2003 PL. Programowanie w VBA.. HELION, 2004. ISBN 837361-504-0. (pol.).
  18. Wyrażenia. [w:] Prezentacja języka VHDL [on-line]. home.elka.pw.edu.pl. [dostęp 2011-09-12]. (pol.).

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.).

Media użyte na tej stronie