|
Serwis Edukacyjny Nauczycieli w I-LO w Tarnowie
|
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
| SPIS TREŚCI |
| Podrozdziały |
W operacjach bitowych biorą udział słówka binarne. Operacje wykonywane są na odpowiadających sobie bitach tych słówek. W języku C++ mamy następujące operacje bitowe:
Operator ~ zmienia wszystkie bity argumentu na przeciwne, czyli wykonuje operację negacji bitów:
| ~0110 = 1001 |
C++// Negacja bitów
// (C)2020 mgr Jerzy Wałaszek
// I LO w Tarnowie
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void itob(unsigned a)
{
for(unsigned m = 8; m > 0; m >>= 1)
cout << ((a & m) ? "1" : "0");
}
int main()
{
srand(time(NULL));
unsigned x = rand() % 16;
cout << "~";
itob(x);
cout << " = ";
itob(~x); // tutaj dokonujemy negacji bitów
cout << endl;
return 0;
}
|
| Wynik: |
| ~0010 = 1101 |
Operator | wykonuje operację alternatywy nad odpowiadającymi sobie bitami argumentów.
| 0101 | 0011 = 0111 |
C++// Alternatywa bitów
// (C)2020 mgr Jerzy Wałaszek
// I LO w Tarnowie
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void itob(unsigned a)
{
for(unsigned m = 8; m > 0; m >>= 1)
cout << ((a & m) ? "1" : "0");
}
int main()
{
srand(time(NULL));
unsigned x = rand() % 16;
unsigned y = rand() % 16;
itob(x);
cout << " | ";
itob(y);
cout << " = ";
itob(x | y); // tutaj dokonujemy alternatywy bitów
cout << endl;
return 0;
} |
| Wynik: |
| 0110 | 1001 = 1111 |
Operator & wykonuje operację koniunkcji nad odpowiadającymi sobie bitami argumentów.
| 0110 & 1011 = 0010 |
C++// Koniunkcja bitów
// (C)2020 mgr Jerzy Wałaszek
// I LO w Tarnowie
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void itob(unsigned a)
{
for(unsigned m = 8; m > 0; m >>= 1)
cout << ((a & m) ? "1" : "0");
}
int main()
{
srand(time(NULL));
unsigned x = rand() % 16;
unsigned y = rand() % 16;
itob(x);
cout << " & ";
itob(y);
cout << " = ";
itob(x & y); // tutaj dokonujemy koniunkcji bitów
cout << endl;
return 0;
} |
| Wynik: |
| 1110 & 0111 = 0110 |
Operator ^ wykonuje operację sumy modulo 2 nad odpowiadającymi sobie bitami argumentów.
| 0111 ^ 1001 = 1110 |
C++// Suma modulo 2 bitów
// (C)2020 mgr Jerzy Wałaszek
// I LO w Tarnowie
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void itob(unsigned a)
{
for(unsigned m = 8; m > 0; m >>= 1)
cout << ((a & m) ? "1" : "0");
}
int main()
{
srand(time(NULL));
unsigned x = rand() % 16;
unsigned y = rand() % 16;
itob(x);
cout << " ^ ";
itob(y);
cout << " = ";
itob(x ^ y); // tutaj dokonujemy sumy symetrycznej bitów
cout << endl;
return 0;
} |
| Wynik: |
| 0110 ^ 0100 = 0010 |
Tabelki opisanych powyżej operacji bitowych są następujące:
| a | ~a |
| 0 | 1 |
| 1 | 0 |
| a | b | a | b |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
| a | b | a & b |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
| a | b | a ^ b |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Uwaga:W języku C++ istnieją dwie formy operatorów:
|
Operator >> przesuwa bity lewego argumentu o zadaną prawym argumentem ilość pozycji w prawo. Na przykład:
| 00111100 >> 1 = 00011110 00111100 >> 2 = 00001111 00111100 >> 3 = 00000111 |
Bity, które wyjdą poza skrajną prawą pozycję są tracone. Przesunięcie bitów w prawo o 1 pozycję jest równoważne dzieleniu przez dwa. Przesunięcie o n pozycji w prawo jest równoważne dzieleniu przez 2n. Operacje przesuwu są bardzo szybkie - o wiele szybsze od dzielenia. Jeśli nasz algorytm dużo dzieli przez 2 (lub potęgę 2), to warto się zastanowić, czy zamiast dzielenia, nie lepsza byłaby operacja przesuwu bitów w prawo. Operacja ta jest jednak ograniczona tylko do liczb całkowitych, natomiast operacja dzielenia może operować na dowolnych typach liczbowych.
Operator << przesuwa bity lewego argumentu o zadaną prawym argumentem ilość pozycji w lewo. Na przykład:
| 00111100 << 1 = 01111000 00111100 << 2 = 11110000 00111100 << 3 = 11100000 |
Operacja przesuwu bitów w lewo jest równoważna mnożeniu przez 2. Przesunięcie bitów w lewo o n pozycji odpowiada pomnożeniu przez 2n. Przesunięcie bitów jest o wiele szybsze od mnożenia.
Operacje bitowe często służą do modyfikacji zawartości zmiennej. Dlatego język C++ posiada formy skrócone operacji przypisania z modyfikacją :
| zamiast | stosuje się |
| a = a | b; | a |= b; |
| a = a & b; | a &= b; |
| a = a ^ b; | a ^= b; |
| a = a >> n; | a >>= n; |
| a = a << n; | a <<= n; |
Poniższy program dokonuje szybkiej konwersji wprowadzonej liczby dziesiętnej na jej zapis w systemie binarnym. Zasada działania opiera się na badaniu stanu kolejnych bitów liczby, która wewnętrznie jest przechowywana w postaci binarnej. Badanie polega na wykonywaniu koniunkcji bitowej z maską, w której jest cyklicznie przesuwany bit z pozycji najstarszej na najmłodszą. Wynik koniunkcji informuje nas o stanie badanego bitu.
C++// przesuw bitów
// (C)2020 mgr Jerzy Wałaszek
// I LO w Tarnowie
#include <iostream>
using namespace std;
int main()
{
unsigned a,m;
cin >> a;
for(m = 2147483648; m > 0; m >>= 1)
cout << ((a & m) ? "1" : "0");
cout << endl;
return 0;
}
|
| Wynik: |
| 68542387 00000100000101011101111110110011 |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.