Operatory przesunięcia bitowego

Operatory przesunięcia przesuwają swój pierwszy operand w lewo (<<) lub w prawo (>>) według liczby pozycji, które określa drugi operand.

Składnia

shift-expression:
additive-expression
shift-expression << additive-expression
shift-expression >> additive-expression

Oba operandy muszą być wartościami całkowitymi. Te operatory wykonują zwykłe konwersje arytmetyczne; typ wyniku jest typem lewego operandu po konwersji.

W przypadku przesunięć po lewej stronie wolne prawe bity są ustawione na 0. W przypadku przesunięć od prawej strony opuszczone lewe bity są wypełniane na podstawie typu pierwszego operandu po konwersji. Jeśli typ to unsigned, są ustawione na 0. W przeciwnym razie są one wypełnione kopiami bitu znaku. W przypadku operatorów przesunięcia po lewej stronie bez przepełnienia instrukcja

expr1 << expr2

jest odpowiednikiem mnożenia przez 2wyrażenie2. W przypadku operatorów przesunięcia w prawo,

expr1 >> expr2

jest odpowiednikiem dzielenia przez 2wyrażenie 2 , jeśli expr1 jest niepodpisane lub ma wartość nienależącą.

Wynik operacji przesunięcia jest niezdefiniowany, jeśli drugi operand jest ujemny, lub jeśli prawy operand jest większy lub równy szerokości w bitach promowanego operandu po lewej stronie.

Ponieważ konwersje wykonywane przez operatory przesunięcia nie zapewniają warunków przepełnienia lub niedopełnienia, informacje mogą zostać utracone, jeśli wynik operacji przesunięcia nie może być reprezentowany w typie pierwszego operandu po konwersji.

unsigned int x, y, z;

x = 0x00AA;
y = 0x5500;

z = ( x << 8 ) + ( y >> 8 );

W tym przykładzie x jest przesunięty w lewo osiem pozycji i y jest przesunięty w prawo osiem pozycji. Wartości przesunięte są dodawane, dając 0xAA55 i przypisane do elementu z.

Przesunięcie wartości ujemnej do prawej daje połowę oryginalnej wartości, zaokrąglonej w dół. Na przykład -253 (11111111 00000011 binarne) przesunięte w prawo o jeden bit generuje -127 (11111111 10000001 binarne). Dodatnia 253 zmienia się w prawo, aby wygenerować +126.

Przesunięcia w prawo zachowują bit znaku. Gdy podpisana liczba całkowita zmienia się w prawo, najbardziej znaczący bit pozostaje ustawiony. Gdy niepodpisane liczby całkowite zmieni się w prawo, najbardziej znaczący bit zostanie wyczyszczone.

Zobacz także

Operatory przesunięcia w lewo i w prawo (>> i <<)