В C# присутствуют побитовые операции, но на практике я их использование так и не встречал, поэтому стало интересно где и когда они используются. Не думаю, что разработчики включили в C# просто так.
Всего в C# присутствую следующие побитовые операции:
- побитовое "и" (AND - &)
- побитовое "или" (OR - |)
- исключающее или (XOR - ^)
- побитовое отрицание (NOT - ~)
- сдвиг влево <<
- сдвиг вправо >>
Каждая из этих операций имеет свои таблицы истинности.
побитовые "и" и "или" встречаются при работе с портами, например:
static void Main()
{
byte port = 0xF0; // 1 1 1 1 0 0 0 0 - начальное значение порта ввода/вывода.
byte mask = 0x02; // 0 0 0 0 0 0 1 0 - маска включения устройства управляемого первым битом.
Console.WriteLine("port = {0:X}", port); // ситуация с лампочкой в комнате
port = (byte)(port | mask); // Включить устройство управляемое первым битом.
Console.WriteLine("port = {0:X}", port); // 1 1 1 1 0 0 0 0
mask = 0xFD; // 1 1 1 1 1 1 0 1 - Создаем маску выключения устройства управляемого первым битом.
port = (byte)(port & mask); // Выключить устройство управляемое первым битом.
Console.WriteLine("port = {0:X}", port);
Console.ReadKey();
}
кроме того побитовое "или" также используется в местах где нужно использовать перечисление BindingFlags
исключающее или используется для шифрования:
ushort secretKey = 0x88;
char character = 'A'; // Исходный символ для шифрования.
Console.WriteLine("Исходный символ: {0}, его код в кодовой таблице: {1:X}", character, (byte)character);
character = (char)(character ^ secretKey);
Console.WriteLine("Зашифрованный символ: {0}, его код в кодовой таблице: {1:X}", character, (byte)character);
character = (char)(character ^ secretKey);
Console.WriteLine("Расшифрованный символ: {0}, его код в кодовой таблице: {1:X}", character, (byte)character);
отрицание используется в различных условиях и при использовании теоремы Де Моргана
побитовые сдвиги используются для определения значения определённого бита в числе
Коне что же это далеко не все их места использования