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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *