Битовый операции в C# (Часть 3)

Операции сдвига

В двух предыдущих статьях я рассказывал о битовых операциях «И» («&») и «ИЛИ» («|»). В этих статья я рассказывал как узнать с помощью битовой операции «И» значение определенного бита, и о том, как с помощью битовой операции «ИЛИ» установить значение нужного бита. Вот ссылки на те статьи: Битовый операции в C# (Часть 1) и Битовый операции в C# (Часть 2). В этой статье я расскажу про операции сдвигов. На самом деле, мы уже сталкивались с подобными операциями. Например, в предыдущей статье, когда мы рассматривали операцию «ИЛИ», мы уже делали битовые сдвиги, когда использовали наложение битовых масок вида 0x01 (это 00000001 в двоичной системе счисления), 0x02 (это 00000010 в двоичной системе счисления), 0x04 (это 00000100 в двоичной системе счисления)… Мы «передвигали» единицу, а точнее не только единицу, а все восемь битов числа на одну позицию влево! И делали мы это в уме, а не средствами C#. По своей сути, сдвиг влево на один бит, это «перемещение» всех битов числа на одну позицию влево, т.е. от младшего бита (самого правого) к старшему (самому правому), таким образом, каждый бит становится «старше» на одну позицию. Но есть пара нюансов… При сдвиге влево на одну позицию, самый старший бит числа теряется, он уходит за пределы числа, а на его место становится тот бит, что был перед ним, а на место самого младшего бита записывается «0».

Вот пример, нужно сдвинуть на один бит все биты числа 113, в двоичном виде оно будет выглядеть так: 01110001. После сдвига на бит влево, мы получим: 11100010, что в десятичной системе счисления выглядит как 226.

Ничего интересного не заметили? На самом деле, сдвиг влево на один дает тот же результат, что и умножение этого числа на два…

Сдвиг влево в C# обозначается операцией «<<«, и пользоваться им можно так:

//Исходная битовая маска
int initMask = 0x01;

//Первая битовая маска, сдвинутая на один бит влево исходная
int firstMask = initMask << 1; // = 0x02

//Еще одна битовая маска, сдвинутая на три бита влево исходная
int secondMask = initMask << 3; // = 0x08

Сдвиг вправо выполняется наоборот, т.е. все биты числа сдвигаются вправо. В случае, когда выполняется сдвиг вправо на одну позицию, теряется младший бит числа, а на место старшего становится «0». Обозначается в C# как «>>». Использовать можно так:

//Исходная битовая маска
int initMask = 0x80;

//Первая битовая маска, сдвинутая на один бит вправо исходная
int firstMask = initMask >> 1; // = 0x40

//Еще одна битовая маска, сдвинутая на три бита вправо исходная
int secondMask = initMask >> 3; // = 0x10

Сдвиг вправо на одну позицию равносилен делению этого же числа на два.

Вот так вот можно использовать битовые сдвиги в C#. А в следующей статье, я расскажу про операцию «ИСКЛЮЧАЮЩЕГО ИЛИ».

 

Добавить комментарий