Освоение побитовых и сдвиговых операторов в C#: полное руководство
Побитовые и сдвиговые операторы в C#
В этом руководстве мы подробно рассмотрим побитовые операторы и операторы сдвига в C#. Язык предоставляет 4 побитовых и 2 сдвиговых оператора.
Побитовые и сдвиговые операторы выполняют операции на уровне битов над целыми числами (int, long и др.) и логическими данными. В повседневном программировании они используются редко.
Если вы хотите узнать о практическом применении, посетите статью о практическом использовании побитовых операций.
Доступные в C# побитовые и сдвиговые операторы перечислены ниже.
| Оператор | Название |
|---|---|
~ | Побитовое дополнение (NOT) |
& | Побитовое И (AND) |
| | Побитовое ИЛИ (OR) |
^ | Побитовое исключающее ИЛИ (XOR) |
<< | Побитовый сдвиг влево |
>> | Побитовый сдвиг вправо |
Побитовое ИЛИ (OR)
Оператор | выполняет побитовую операцию ИЛИ над соответствующими битами двух операндов. Если хотя бы один бит равен 1, результат 1, иначе 0.
Для операндов типа bool побитовое ИЛИ эквивалентно логическому ИЛИ.
Пример:
14 = 00001110 (в двоичном) 11 = 00001011 (в двоичном)
Побитовое ИЛИ между 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
Побитовое И (AND)
Оператор & выполняет побитовую операцию И. Если хотя бы один бит равен 0, результат 0, иначе 1.
Для bool эквивалентно логическому И.
Пример (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.
Пример (14 и 11):
00001110 00001011 -------- 00000101 = 5 (в десятичном)
Подробнее о применении XOR см. в статье «Магия XOR».
Пример 3: Побитовое XOR
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
Побитовое дополнение (NOT)
Оператор ~ — унарный, инвертирует каждый бит: 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
Мы ожидали 229, но получили -27. Почему?
Двоичное значение 11100101 (229) в представлении со знаком является дополнительным кодом числа -27. Отрицательные числа в компьютере хранятся в дополнительном коде.
Для любого целого n дополнительный код равен -(n+1).
| Десятичное | Двоичное | Дополнительный код |
|---|---|---|
| 0 | 00000000 | -(11111111 + 1) = -00000000 = -0 |
| 1 | 00000001 | -(11111110 + 1) = -11111111 = -256 |
| 229 | 11100101 | -(00011010 + 1) = -00011011 = -27 |
Переполнение игнорируется. Побитовое дополнение 26 дает 229, а его дополнительный код — -27. Поэтому вывод -27.
Побитовый сдвиг влево
Оператор << сдвигает число влево на заданное число бит. Младшие биты заполняются нулями.
В десятичной системе эквивалентно:
num * 2^bits
Пример:
42 = 101010 (в двоичном)
Сдвиг влево:
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
Побитовый сдвиг вправо
Оператор >> сдвигает число вправо на заданное число бит.
В десятичной системе эквивалентно:
floor(num / 2^bits)
Пример (42 = 101010):
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
Язык C
- Понимание ключевых слов и идентификаторов C#: правила, списки и лучшие практики
- Операторы C# — исчерпывающее руководство по операторам в C#
- Освоение побитовых и сдвиговых операторов в C#: полное руководство
- Освоение операторов C++: полное руководство с практическими примерами
- Операторы в C: исчерпывающее руководство
- Мастерство операторов Python: Полное руководство
- Освоение операторов Java: типы, синтаксис и практические примеры
- IoT и блокчейн: смена парадигмы в доверии к данным и эффективности
- Операторы в C++: типы, примеры и практические программы
- Побитовые операторы в C: И, ИЛИ, XOR, сдвиги и дополнение — подробно