Побітовий зсув вліво та вправо

Документація

Побітовий зсув вліво (<<) та вправо (>>)


Опис


Є два побітові оператори зсуву у C++: оператор зсуву вліво << та оператор зсуву вправо >>. Ці оператори призводять до того, що біти в лівому операнді зсуваються ліворуч чи праворуч на кількість позицій, зазначену правим операндом.

Синтаксис

змінна << кількість бітів

змінна >> кількість бітів

Параметри

змінна — (byte, int, long) ціле число бітів <= 32

Приклад

int a = 5;        // у двійковій системі: 0000000000000101
int b = a << 3;   // у двійковій системі: 0000000000101000, або 40 у десятковій
int c = b >> 3;   // у двійковій системі: 0000000000000101, або назад до 5, як ми й почали


Коли Ви зсуваєте значення x на y бітів (x << y), то найлівіші y бітів в x втрачаються, буквально зсуваються з існування:

int a = 5;        // у двійковій системі: 0000000000000101
int b = a << 14;  //  у двійковій системі: 0100000000000000 - перша 1 зі 101 була відкинута


Якщо Ви впевнені, що жоден біт у значенні не зникає, простий спосіб розібратися — вважати, що оператор зсуву вліво — це множення лівого операнда на 2 в степені, показником якого є правий операнд. Наприклад, для того, щоб отримати степінь 2, можна використати такі вирази:

1 <<  0  ==    1
1 <<  1  ==    2
1 <<  2  ==    4
1 <<  3  ==    8
...
1 <<  8  ==  256
1 <<  9  ==  512
1 << 10  == 1024
...


Коли Ви зсуваєте x вправо на y бітів (x >> y), і старший біт в x видає 1, поведінка залежить від конкретного типу даних x. Якщо x має тип int, старший біт є знаковим бітом, що визначає, є x від'ємним чи ні, як вже зазначалося вище. В цьому випадку знаковий біт копіюється в нижчі біти з езотеричних історичних причин:

int x = -16;     // у двійковій системі: 1111111111110000
int y = x >> 3;  // у двійковій системі: 1111111111111110


Ця поведінка, що має назву розширення знака, часто не те, що Вам потрібно. Замість цього Вам може знадобитися зсунути нулі зліва. Виходить, що правила зсуву вправо відрізняються для непозначених виразів int, отже Ви можете використовувати певний тип даних, щоб уникнути копіювання одиниць зліва:

int x = -16;                   // у двійковій системі: 1111111111110000
int y = (unsigned int)x >> 3;  // у двійковій системі: 0001111111111110


Якщо Ви досить уважні, щоб уникнути розширення знака, можете використовувати оператор зсуву вправо >> для того, щоб ділити на степінь числа 2. Наприклад:

int x = 1000;
int y = x >> 3;   // цілочисельне ділення 1000 на 8, результат y = 125.


Повернутись до головної

Коментарі 0

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.