Site Language

Translate

Russian Albanian Arabic Armenian Azerbaijani Belarusian Bulgarian Catalan Croatian Czech Danish Dutch English Estonian Filipino Finnish French Galician Georgian German Greek Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Serbian Slovak Slovenian Spanish Swedish Turkish Ukrainian Yiddish

CashBack Реальный возврат при покупках в интернете

CashBack Все честно и без обмана

Побитовый свдиг влево (<<), побитовый сдвиг вправо (>>)

Описание

В 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. Как уже отмечалось ранее, в переменных типа int старший бит является знаковым битом, определяющим является ли число положительным или отрицательным. Если переменная x имеет тип int, то при сдвиге x вправо знаковый бит копируется в младшие биты (по историческим причинам):

int x = -16; // в двоичной системе: 1111111111110000

int y = x >> 3; // в двоичной системе: 1111111111111110

Такое поведение называется расширением знака и, как правило, нежелательно: вместо единиц пользователь чаще ожидает увидеть нули в левой части x на месте свдинутых бит. В то же время для беззнаковых целых чисел (переменные типа unsigned int) действуют другие правила сдвига вправо. Поэтому для предотвращения копирования единиц в старших разрядах сдвигаемой переменной x, можно прибегнуть к преобразованию типов:

int x = -16; // в двоичной системе: 1111111111110000

int y = (unsigned int)x >> 3; // в двоичной системе: 0001111111111110

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

int x = 1000;

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

Рекомендуем:

int

digitalWrite()

Константы

digitalRead()

setBitOrder()

transfer()

setDataMode()

SPI на Arduino Due

setClockDivider()

SoftwareSerial

analogReference(type)

Wire

SPI

attachInterrupt()

pinMode()

EEPROM

Программирование, Типы данных int, Управляющие операторы, Унарные операторы, Логические операторы, Типы данных, Синтаксис, Операции с битами и байтами, Арифметические операторы, Внешние прерывания, Операторы сравнения, Унарные операторы, Унарные операторы, Дополнительные фунции ввода/вывода,  Логические операторы, Типы данных, Функции transfer(), Массивы, Константы, Цифровой ввод/вывод, Переменные, Преобразование типов данных, Функции digitalRead(), Цифровой ввод/вывод, Аналоговый ввод/вывод, Функции setBitOrder(), Функции digitalWrite(), Функции digitalRead(), Дополнительные фунции ввода/вывода, Генераторы случайных значений, Операции с битами и байтами, Внешние прерывания, Работа со временем, Математические функции, Математические функции, Тригонометрические функции, Тригонометрические, функции, Типы данных, Генераторы случайных значений, Функции digitalRead(), Типы данных int, Операции с битами и байтами, Функции digitalWrite(), Функции digitalRead(), Внешние прерыванияРабота со временем, Функции pinMode(), Функции attachInterrupt(), Функции analogReference(type),Синтаксис,  Арифметические операторы, Операторы сравнения, Функции setClockDivider(), Функции setDataMode(), Функции transfer(), Функции setBitOrder(), Функции digitalWrite(), Функции digitalRead(), Типы данных int, Программирование, Побитовый свдиг влево (<<), побитовый сдвиг вправо (>>), Управляющие операторы, Константы.

 

All Vintage Vinyl Records VinylSU.xyz

1.png2.png3.png4.png5.png