В этом руководстве мы подробно узнаем о побитовых операторах и операторах битового сдвига в 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 |
---|---|---|
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