Przesunięcie w lewo: <<
Operator przesuwa bity pierwszego operanda w lewo o liczbę miejsc określoną przez drugi operand. Zwolnione miejsca są wypełniane zerami, a bity wykraczające poza lewą granicę pierwszego oprandu są usuwane. Operator tworzy nową wartość, ale nie zmienia żadnego z operandów. Zmianę wartości otrzymujemy poprzez zastosowanie <<=:
int n = 1; // przypisuje zmiennej 'm' wartosc 4 int m = n << 2; // zmienia wartosc 'n' na 4 n <<= 2;
Przesunięcie w prawo: >>
Operator przesuwa bity pierwszego operanda w prawo o liczbę miejsc określoną przez drugi operand. Zwolnione miejsca są wypełniane zerami, a bity wykraczające poza prawą granicę pierwszego oprandu są usuwane. Operator tworzy nową wartość, ale nie zmienia żadnego z operandów. Zmianę wartości otrzymujemy poprzez zastosowanie >>=.
W przypadku wartości:
– bez znaku zwalniane miejsca są wypełniane zerami,
– ze znakiem efekt zależy od komputera: zwalniane miejsca mogą być wypełniane zerami lub kopiami bitu przechowującego znak (bajtu najbardziej znaczącego):
// wartosc ze znakiem, pierwsza mozliwosc (10010010) >> 2 == (00100100) // wartosc ze znakiem, druga mozliwosc (10010010) >> 2 == (11100100) // wartosc bez znaku (10010010) >> 2 == (00100100) int n = 16; // 'm' otrzymuje wartosc 2, 'n' nadal wynosi 16 int m = n >> 3; // 'n' otrzymuje wartosc 2 n >>= 3;
Zastosowanie
Bitowe operatory przesunięcia
Operatory przesunięcia umożliwiają szybki, sposób mnożenia i dzielenia przez potęgi dwójki:
// mnozy liczbe przez 2 do potegi n-tej liczba << n; // dzieli liczbe przez 2 do potegi n-tej, jesli liczba nie jest ujemna liczba >> n;
Operatory przesunięcia mogą również slużyć do wydobywania grupy bitów z większych jednostek.
#define MASKA 0xff unsigned long n = 0x002a162f; unsigned char a, b, c; a = n & MASKA; b = (n>>8) & MASKA; c = (n>>16) & MASKA;
0 Komentarzy