Урок 9. Логические побитовые операторы C#


Все уроки по C# расположены здесь

Логические операции также могут выполняться на целочисленных представлениях двоичных чисел. В статье рассматриваются логические побитовые операторы.

Побитовая логика и двоичные файлы

На предыдущем уроке я описал логические операторы и их воздействия на логическое значение. Побитовые логические операторы обеспечивают те же логические AND, OR и XOR функции для работы на каждый бит целочисленного значения. Это может быть очень полезно для получений значений отдельных битов чисел, которые используются как битовые поля.

Для разработчиков, которые не знакомы с запросом отдельных битов в битовых полях, рассмотрим следующий пример. Предположим, что у нас есть устройство, подключенное к последовательному порту, которое указывает на его статус, используя один байт. Этот байт состоит из восьми двоичных цифр или битов, каждый из которых предоставляет некоторую булеву информацию. В следующей таблице описывается использование каждого бита. Для ясности я указал значение, которое бы содержал байт, если бы это было значение типа данных byte с только этим битом.



Чтение из нашего примера устройства может привести к результату 187 или 10111011 в двоичном формате. Сравнивая это значение с нашей таблицей, мы видим, что устройство готово, отключено и может передавать данные.

Это много информации для хранения или извлечения из одного байта информации. В следующих разделах объясняется, как использовать побитовые операторы для чтения и обработки битов.

Побитовый оператор AND

Побитовый оператор AND обычно используется для проверки значений битов в большом целом числе. Для нашего примера устройства мы можем захотеть изолировать значение бита 5, чтобы определить, присутствует ли сигнал носителя. Используя оператор AND со значением 32, все биты, кроме бита 5, очищаются. Другими словами, единственный возможный бит набора, который может остаться, - это бит 5. Простая диаграмма, показывающая двоичные и десятичные представления, прояснит это.



Каждая бинарная пара цифр зависит индивидуально от и операции. Только бит 5 может остаться установленным в нашем результате. Это ключ к чтению изолированных битов с помощью побитового AND. Для одного бита, если результирующее значение равно нулю, то бит не был установлен. Если результат ненулевой, тестируемый бит должен быть установлен.

Операция AND также может использоваться для очистки битов в целочисленном значении, т. е. установить некоторые биты на нуль. Например, чтобы очистить бит 5 от конфигурационного байта, указывающего на то, что несущий сигнал отсутствует, мы можем выполнить операцию AND со значением с битом 5 не задано. Опять же, двоичное представление поможет прояснить это.



Для побитового операции мы используем символ амперсанда (&). Следующие примеры иллюстрируют чтение изолированного бита из целочисленного значения.

int deviceConfiguration = 187;   // 10111011
int carrierMask = 32;            // 00100000
int connectedMask = 64;          // 01000000
 
int carrier = deviceConfiguration & carrierMask;        // Result = 32
 
int connected = deviceConfiguration & connectedMask;    // Result = 0
Побитовый оператор OR

Побитовый оператор OR обычно используется, чтобы установить бит в большее целое число, т. е.. установитm некоторые биты в один. Для нашего примера устройства мы можем установить бит 2, чтобы указать, что мы хотим, чтобы были команды echo . Давайте сначала рассмотрим двоичный файл или операцию.



Каждая бинарная пара цифр зависит по отдельности от операции или. Если второй операнд имеет нулевой бит, то бит из первого операнда копируется в конечный результат. Однако, если мы установим один бит, это гарантирует, что соответствующий результирующий бит будет установлен в один.

Для достижения побитового или операции мы используем символ бара (|). В следующем примере показано задание bits в целочисленном значении.

int deviceConfiguration = 187;   // 10111011
int echoMask = 4;                // 00000100
 
int newConfiguration = deviceConfiguration | echoMask;   // Result = 191
Побитовый оператор XOR

Побитовый исключающий (XOR) оператор позволяет программисту переключить определенные биты между их возможными значениями нуля или единицы. Обычно используется побитовый оператор XOR для обеспечения базового обратимого шифрования данных. Поскольку побитовое исключение или переключает некоторые биты, выполнение операции дважды восстанавливает исходные значения. С длинным ключом для шифрования это может быть довольно эффективным (хотя и нецелесообразным для данных, которые должны храниться очень безопасно). Ниже приведен пример.



Каждая пара двоичных цифр зависит индивидуально от операции XOR. Везде, где второй операнд имеет нулевой бит, соответствующий бит из первого операнда копируется в результирующее значение. Однако, если мы установим один бит, это переключит соответствующий бит в результате.

Для побитовой операции XOR используется знак вставки (^). В следующем примере показано переключение битов в целочисленном значении для кодирования и декодирования данных.

int valueToEncode = 187; // 10111011
int keyMask = 85; // 010101
 
// Кодировать
int encoded = valueToEncode ^ keyMask; // результат = 238
 
// Декодировать
int decoded = закодировано ^ keyMask; // результат = 187
Оператор NOT

Последний основной логический побитовый оператор предоставляет функцию NOT, аналогичную логическому оператору NOT, но выполняемую для каждого отдельного бита. Это как one деятельность комплекта. Двоичный пример выглядит следующим образом:



Побитовый оператор NOT является унарным оператором, так как включает один операнд. В отличие от других побитовых операторов, побитовая версия не использует тот же символ, что и аналогичный логический оператор. Чтобы получить дополнение, символ тильды (~) располагается слева от изменяемого значения.
byte valueToComplement = 187;                  // 10111011
 
byte complement = (byte) ~valueToComplement;   // Result = 68
В приведенном выше примере видно, что результат операции NOT был приведен к байту. Это происходит потому, что оператор возвращает целое значение, которое не может быть присвоено непосредственно в байт. Обратите внимание также, что я использовал байт без знака. В знаковом байте бит наивысшего порядка используется для определения, является ли значение отрицательным, а остальные биты корректируются для отрицательных чисел с использованием дополнительной нотации два. Поэтому использование подписанных значений может дать результаты, которые сложно расшифровать.

Составные операторы присваивания

В седьмой главе основ C# я представил составные операторы присваивания для арифметических функций. Такой же тип составного оператора существует для побитовых операторов AND, OR и XOR. Синтаксис оператора присваивания совпадает в природе с арифметикой разнообразие. Ниже приводятся некоторые примеры.

// Инициализация
byte value = 240;       // 11110000
 
// Очищаем bit 7
value &= 127;           // Result = 112 = 01110000
 
// Устанавливаем bit 0
value |= 1;             // Result = 113 = 01110001
 
// Переключение битов 1, 3, 5 и 7
value ^= 170;           // Result = 219 = 11011011
Приоритет операторов

Теперь можно добавить новые операторы в таблицу приоритетов операторов:



Предыдущий: Урок 8. Логические операторы C# | Следующий: Урок 10. Операторы побитового сдвига C#
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, Уроки по си шарп, си шарп, операторы




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 5. Оператор SELECT
Урок 36. Краткие функции-стрелки
Урок 10. Операторы побитового сдвига C#