Поразрядные операторы C #: AND, OR, XOR, операции дополнения и сдвига

В этом руководстве мы подробно узнаем о побитовых операторах и операторах битового сдвига в C #. C # предоставляет 4 побитовых и 2 битовых оператора сдвига.

Операторы побитового и битового сдвига используются для выполнения операций битового уровня с целыми (int, long и т. Д.) И логическими данными. Эти операторы обычно не используются в реальных жизненных ситуациях.

Если вам интересно узнать больше, посетите практические приложения побитовых операций.

Операторы побитового и битового сдвига, доступные в C #, перечислены ниже.

Список побитовых операторов C #
Оператор Имя оператора
~ Побитовое дополнение
& Побитовое И
| Побитовое ИЛИ
^ Побитовое исключающее ИЛИ (XOR)
<< Побитовый сдвиг влево
>> Побитовый сдвиг вправо

Побитовое ИЛИ

Оператор побитового ИЛИ представлен как |. Он выполняет побитовую операцию ИЛИ над соответствующими битами двух операндов. Если один из битов равен 1, результат будет 1. В противном случае результат есть 0.

Если операнды имеют тип bool, побитовая операция ИЛИ эквивалентна логической операции ИЛИ между ними.

Например,

 14 = 00001110 (двоичный) 11 = 00001011 (двоичный)

Побитовая ORоперация между 14 и 11:

 00001110 00001011 -------- 00001111 = 15 (в десятичной системе)

Пример 1: побитовое ИЛИ

 using System; namespace Operator ( class BitWiseOR ( public static void Main(string() args) ( int firstNumber = 14, secondNumber = 11, result; result = firstNumber | secondNumber; Console.WriteLine("(0) | (1) = (2)", firstNumber, secondNumber, result); ) ) ) 

Когда мы запустим программу, вывод будет:

14 | 11 = 15

Побитовое И

Побитовый оператор И представлен как &. Он выполняет побитовую операцию И над соответствующими битами двух операндов. Если один из битов равен 0, результат будет 0. В противном случае результат есть 1.

Если операнды имеют тип bool, побитовая операция И эквивалентна логической операции И между ними.

Например,

 14 = 00001110 (двоичный) 11 = 00001011 (двоичный)

Побитовая операция И между 14 и 11:

 00001110 00001011 -------- 00001010 = 10 (в десятичной системе)

Пример 2: побитовое И

 using System; namespace Operator ( class BitWiseAND ( public static void Main(string() args) ( int firstNumber = 14, secondNumber = 11, result; result = firstNumber & secondNumber; Console.WriteLine("(0) & (1) = (2)", firstNumber, secondNumber, result); ) ) ) 

Когда мы запустим программу, вывод будет:

 14 и 11 = 10

Побитовое исключающее ИЛИ

Побитовый оператор XOR представлен как ^. Он выполняет побитовую операцию XOR над соответствующими битами двух операндов. Если соответствующие биты совпадают , результат будет 0. Если соответствующие биты различны , результат будет 1.

Если операнды имеют тип bool, побитовая операция XOR эквивалентна логической операции XOR между ними.

Например,

 14 = 00001110 (двоичный) 11 = 00001011 (двоичный)

Побитовая операция XOR между 14 и 11:

 00001110 00001011 -------- 00000101 = 5 (в десятичной системе)

Если вы хотите больше узнать об использовании побитового XOR, посетите The Magic of XOR

Пример 3: побитовое исключающее ИЛИ

 using System; namespace Operator ( class BitWiseXOR ( public static void Main(string() args) ( int firstNumber = 14, secondNumber = 11, result; result = firstNumber^secondNumber; Console.WriteLine("(0) (1) = (2)", firstNumber, secondNumber, result); ) ) ) 

Когда мы запустим программу, вывод будет:

 14 11 = 5

Побитовое дополнение

Оператор побитового дополнения представлен как ~. Это унарный оператор, т.е. работает только с одним операндом. ~Оператор инвертирует каждый бит т.е. изменения от 1 до 0 и от 0 до 1.

Например,

 26 = 00011010 (в двоичном формате)

Операция побитового дополнения на 26:

 ~ 00011010 = 11100101 = 229 (в десятичной системе)

Пример 4: Побитовое дополнение

 using System; namespace Operator ( class BitWiseComplement ( public static void Main(string() args) ( int number = 26, result; result = ~number; Console.WriteLine("~(0) = (1)", number, result); ) ) ) 

Когда мы запустим программу, вывод будет:

 ~ 26 = -27

Получили - 27как результат, когда ожидали 229. Почему это случилось?

Это происходит потому, что двоичное значение, 11100101которое мы ожидаем, на 229самом деле является представлением с дополнением до 2 -27. Отрицательные числа в компьютере представлены в виде дополнения до 2.

Для любого целого n дополнение до 2 nбудет -(n+1).

2 дополнения
Десятичная дробь Двоичный Дополнение 2
0 00000000 - (11111111 + 1) = -00000000 = -0 (в десятичной системе)
1 00000001 - (11111110 + 1) = -11111111 = -256 (в десятичной системе)
229 11100101 - (00011010 + 1) = -00011011 = -27

Значения переполнения игнорируются в дополнении до 2.

Поразрядное дополнение 26- 229 (в десятичной системе), а двойное дополнение 229- -27. Следовательно, вывод -27вместо 229.

Побитовый сдвиг влево

Оператор побитового сдвига влево представлен как <<. <<Оператор сдвигает число влево на заданное число бит. К младшим битам добавляются нули.

В десятичном виде это эквивалентно

 число * 2 бита

Например,

 42 = 101010 (в двоичном формате)

Побитовая операция сдвига подъема на 42:

 42 << 1 = 84 (в двоичном формате 1010100) 42 << 2 = 168 (в двоичном формате 10101000) 42 << 4 = 672 (в двоичном формате 1010100000)

Пример 5: Побитовый сдвиг влево

 using System; namespace Operator ( class LeftShift ( public static void Main(string() args) ( int number = 42; Console.WriteLine("(0)<<1 = (1)", number, number<<1); Console.WriteLine("(0)<<2 = (1)", number, number<<2); Console.WriteLine("(0)<<4 = (1)", number, number<<4); ) ) ) 

Когда мы запустим программу, вывод будет:

 42 << 1 = 84 42 << 2 = 168 42 << 4 = 672

Побитовый сдвиг вправо

Оператор побитового сдвига влево представлен как >>. >>Оператор сдвигает число вправо на заданное число битов. Первый операнд сдвигается вправо на количество битов, указанное вторым операндом.

В десятичном виде это эквивалентно

 этаж (число / 2 бита)

Например,

 42 = 101010 (в двоичном формате)

Побитовая операция сдвига подъема на 42:

 42 >> 1 = 21 (в двоичном формате 010101) 42 >> 2 = 10 (в двоичном формате 001010) 42 >> 4 = 2 (в двоичном формате 000010)

Пример 6: побитовый сдвиг вправо

 using System; namespace Operator ( class LeftShift ( public static void Main(string() args) ( int number = 42; Console.WriteLine("(0)>>1 = (1)", number, number>>1); Console.WriteLine("(0)>>2 = (1)", number, number>>2); Console.WriteLine("(0)>>4 = (1)", number, number>>4); ) ) ) 

Когда мы запустим программу, вывод будет:

 42 >> 1 = 21 42 >> 2 = 10 42 >> 4 = 2

Интересные статьи...