Алексей Немиро
Профи
(968)
10 лет назад
Это побитовые операторы.
Битовые операции выполняются над битами (из которых состоят байты).
Если просто, то бит - это двоичное число, которое может иметь значение 0 или 1, которое в десятичной системе соответствует расположению бита в байте. В одном байте восемь бит. Первый бит в байте определяет значение один, второй - два, третий - четыре, четвертый - восемь, пятый - шестнадцать, шестой - тридцать два, седьмой - шестьдесят четыре и восьмой - сто двадцать восемь. Т. е. если третий бит в байте имеет значение 1 (светится/есть ток), а остальные ноль (выключены/нет тока), то в десятичной системе это будет значение четыре (т. е. байт будет иметь значение 4). Если третий и пятый биты имеют значение 1, то: 4 + 16 = 20 (байт будет иметь значение 20). Таким образом, комбинирую единицы и нули в байте можно получить любое значение от нуля до 255.
Битовые операции позволяют работать с единицами у нулями. Часто можно встретить использование битовых операций в перечислениях. Например:
var r = new Regex(@"\w", RegexOptions.Compiled | RegexOptions.IgnoreCase);
В данном случае используется оператор | (ИЛИ). Внутри класса Regex для проверки наличия определенных опций используется оператор & (И).
Более простые примеры:
Console.WriteLine(2 | 4); // 2 + 4 - будет шесть
Если посмотреть на единицы и нули, то число два:
0100 0000
число четыре:
0010 0000
оператор ИЛИ смешивает единицы и нули.
Если значения обоих бит равны, то остается это значение.
Если в одном из бит значение один, а в другом ноль, то используется значение один.
Таким образом, смешивая числа 2 и четыре получается:
0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 (+ для ровности текста, чтобы было понятно, как делается расчет)
т. е. в десятичной системе будет:
0 + 2 + 4 + 0 + 0 + 0 + 0 + 0 = 6
Оператор AND работает наоборот. Если значения обоих битов равны, то будет это значение. Если один из битов равен нулю, а второй единице, то будет ноль.
Console.WriteLine(6 & 2); // будет 2, т. к. из шести можно получить число 2, т. к. 2 + 4
В двоичном виде число шесть:
0110 0000
а число два:
0100 0000
Результатом использования оператора И будет:
0 + 1 + 0 + 0 + 0 + 0 + 0 + 0
в десятичное системе
0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 = 2
что позволяет в десятичной системе исчисления проверить наличие двойки в шестерке :)
Console.WriteLine(6 & 8); // будет 0, т. к. в шестерке нет восьмерки
Console.WriteLine(2 | 4 | 8); // 2 + 4 + 8 = 14
Console.WriteLine(14 & 8); // будет 8, т. к. в числе 14 есть восьмерка
Console.WriteLine(14 & 1); // будет 0, т. к. в числе 14 нет числа 1
Console.WriteLine(1 | 2 | 4 | 8); // 1 + 2 + 4 + 8 = 15
Console.WriteLine(15 & 1); // будет 1, т. к. в числе 15 есть единица
Операторы ИЛИ и И используются довольно часто.
Оператор XOR (исключающее ИЛИ) использует единицу, если один из бит имеет значение 1. В остальных случаях будет значение ноль. Если оба бита равны единице, то будет значение ноль.
Console.WriteLine(6 ^ 2); // будет 4
В двоичной системе число шесть:
0110 0000
а число два:
0100 0000
Результатом использования оператора XOR будет:
0 + 0 + 1 + 0 + 0 + 0 + 0 + 0
0 + 0 + 4 + 0 + 0 + 0 + 0 + 0 = 4
XOR можно использовать для шифрования данных.
Сдвиг влево/вправо (логический) - просто смещает в байте единицы и нули влево или вправо.
Например:
Console.WriteLine(6 << 3); // будет 24
Число шесть:
0110 0000
число два:
0100 0000
Сдвиг шестерки влево на два (шага):
шаг 1:
0011 0000
шаг 2:
0001 1000
Да, левая сторона у нас справа :) Это зависит от того, с какой стороны смотреть на байт.
0 + 0 + 0 + 1 + 01 + 0 + 0 + 0
0 + 0 + 0 + 8 + 16 + 0 + 0 + 0 = 24
Console.WriteLine(6 << 3); // будет 48
шаг 1:
0011 0000
шаг 2:
0001 1000
шаг 3:
0000 1100
Как-то так :)