Operacje bitoweNiskopoziomoweWydajność
Etap 9: Operacje bitowe w C++
Przewodnik po manipulacji pojedynczymi bitami danych. Klucz do optymalizacji i programowania niskopoziomowego.
11 lutego 20263 min czytania
Udostępnij:
Operacje bitowe: Myślenie w systemie binarnym
Operacje bitowe pozwalają na manipulację danymi na najniższym możliwym poziomie – poziomie pojedynczych bitów (0 i 1). Na kolokwium te zadania często sprawdzają Twoją biegłość w logicznym myśleniu i rozumieniu, jak liczby są reprezentowane w pamięci.
1. Podstawowe operatory bitowe
W C++ mamy sześć głównych operatorów bitowych:
&(AND): Wynik ma 1 tylko tam, gdzie oba bity są równe 1.|(OR): Wynik ma 1, jeśli przynajmniej jeden bit jest równy 1.^(XOR): Wynik ma 1, jeśli bity są różne (jeden to 0, drugi to 1).~(NOT): Negacja – zamienia 0 na 1 i 1 na 0.<<(Przesunięcie w lewo): Przesuwa bity w lewo, dopisując zera z prawej (efektywnie mnożenie przez ).>>(Przesunięcie w prawo): Przesuwa bity w prawo (efektywnie dzielenie całkowite przez ).
2. Praktyczne zastosowania (Zadania kolokwialne)
Sprawdzanie, czy liczba jest parzysta
Zamiast % 2, możemy sprawdzić najmłodszy bit. Jeśli jest równy 0, liczba jest parzysta.
cpp
if ((liczba & 1) == 0) {
std::cout << "Parzysta";
}Ustawianie konkretnego bitu (Maska)
Aby ustawić n-ty bit na 1 (licząc od 0), używamy operatora |.
cpp
int liczba = 0;
int n = 3; // chcemy ustawić 4. bit
liczba = liczba | (1 << n);Sprawdzanie wartości n-tego bitu
cpp
bool czyUstawiony = (liczba >> n) & 1;3. Przesunięcia bitowe a wydajność
Przesunięcia bitowe są znacznie szybsze niż standardowe mnożenie czy dzielenie przez potęgi dwójki.
x << 1to to samo cox * 2.x >> 1to to samo cox / 2.
Pułapki na kolokwium
- Mylenie operatorów logicznych z bitowymi: Nigdy nie używaj
&&zamiast&.&&zwraca tylkotrue/false, podczas gdy&operuje na każdej parze bitów osobno. - Priorytety operatorów: Operatory bitowe mają niższy priorytet niż operatory porównania. Zawsze używaj nawiasów! Zapis
x & 1 == 0zostanie zinterpretowany jakox & (1 == 0), co jest błędem. Pisz:(x & 1) == 0. - Liczby ujemne: Przesunięcia bitowe na liczbach ujemnych mogą zachowywać się różnie zależnie od kompilatora (tzw. Implementation Defined Behavior). Staraj się używać
unsigned intprzy operacjach bitowych.
Przykład: Zamiana wartości bez zmiennej pomocniczej (XOR Swap)
To klasyk, o który mogą zapytać:
cpp
a = a ^ b;
b = a ^ b;
a = a ^ b;