Как работает xor. Логические операторы VBA. Схема выделения фронта и среза импульса

C++. Логические операции. Поразрядные логические операции. Операции сдвига. Операция XOR

1. Для каких типов можно применять логические операции, поразрядные логические операции и операции сдвига?

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

2. Какие логические операции используются в C/C++?

В языке программирования C/C++ используются следующие логические операции:

  • && – логическое «И»;
  • || – логическое «ИЛИ»;
  • ! – логическое «НЕТ».

Результатом логических операций есть значение false или true . В языке C++ принято, что значение false считается равным 0, а значение true считается равным 1.

Отсюда можно сделать вывод, что false < true . Например:

// логические операции bool res; res = false < true ; // res = true
3. Таблица истинности логических операций

Таблица истинности логических операций && (логическое «И»), || (логическое «ИЛИ»), ! (логическое «НЕТ») имеет следующий вид:

В языке C/C++ принимается, что значение false равно 0, а значение true не равно 0 (любое ненулевое целочисленное значение).

4. Примеры использования логических операций в C++

Пример 1. Логическая операция в сочетании с логическим выражением

// логические операции bool res; int a, b; // операция && (AND) a = 8; b = 5; res = a && b; // res = True a = 0; res = a && b; // res = False // операция || (OR) a = 0; b = 0; res = a || b; // res = False b = 7; res = a || b; // res = True // операция! (логическое "НЕТ") a = 0; res = !a; // res = True a = 15; res = !a; // res = False

Пример 2. Логическая операция в условных выражениях. Приведен фрагмент кода, в котором логическая операция используется в операторе условного перехода if .

// логические операции в условных выражениях int a, b; bool res; a = 0; b = 3; res = false ; if (a && b) res = true ; // res = false a = 0; b = 7; if (a || b) res = true ; // res = true
5. Какие поразрядные логические операции используются в C/C++?

Язык С/С++ поддерживает следующие поразрядные логические операции :

  • & – поразрядное логическое И (AND );
  • ^ – поразрядное сложение по модулю 2 (XOR — исключающее ИЛИ);
  • | – поразрядное логическое ИЛИ (OR );
  • ~ – поразрядная инверсия (NOT ).

Операции & , ^ , | есть бинарными. Это означает, что они требуют двух операндов. Биты любого операнда сравниваются между собой по следующему правилу : бит в позиции 0 первого операнда сравнивается с битом в позиции 0 второго операнда. Затем бит в позиции 1 первого операнда сравнивается с битом в позиции 1 второго операнда. Так сравниваются все биты целочисленных операндов.

6. Таблица истинности поразрядных логических операций

Каждый бит результата определяется на основе двух операндов, которые являются битами, так как показано в таблице.

Инверсия требует единого операнда справа от знака ~ . Результат получается поразрядной инверсией всех битов операнда.

7. Пример работы с логическими побитовыми операциями

Пусть даны два числа 17 и 45 типа unsigned short int . Каждое из чисел занимает в памяти 1 байт или 8 бит. Ниже приведен пример того, как происходит вычисление для каждой побитовой операции

Как видно из примера, происходит выполнение заданной операции над каждым битом.

8. Какие операции сдвига используются в C/C++?

Язык С/С++ включают две операции поразрядного сдвига :

  • << – сдвиг влево значения операнда на заданное количество бит. Операнд размещается слева от знака операции. Число сдвигаемых бит указывается справа от знака операции;
  • >> – сдвиг вправо значения операнда на заданное количество бит. Операнд размещается слева от знака операции (<<). Количество сдвигаемых бит размещается справа от знака операции.

Выдвижные биты теряются, а «входят» нулевые биты. Сдвиг операндов влево на 1, 2, 3 и более разрядов – наиболее быстрый способ умножения на 2, 4, 8, … Сдвиг операндов вправо на 1, 2, 3 и более разрядов – наиболее быстрый способ деления на 2, 4, 8, …

Если в программе нужно, чтобы операция умножения целочисленных операндов на 2, 4, 8 и т.д. происходила максимально быстро, то целесообразно использовать операцию сдвига влево.

Это касается и случаев, когда нужно максимально быстро поделить целочисленный операнд на 2, 4, 8 и т.д. В этих случаях рекомендуется использовать сдвиг вправо.

9. Примеры использования операций сдвига в программе
// Операции сдвига int a; int b; int c; a = 15; b = -5; // сдвиг влево - умножение c = a << 1; // c = a * 2^1 = 30 c = b << 2; // c = b * 2^2 = -20 // сдвиг вправо - деление c = a >> 3; // c = a / 2^3 = 1 c = b >> 1; // c = b / 2^1 = -3
10. Какое отличие между логическими операциями и поразрядными логическими операциями?

В логических операциях сравнивается значение двух операндов целиком. Каждый из операндов может иметь значение true или false . Язык C/C++ допускает сравнение операндов, которые являются целыми числами. В этом случае целочисленное значение 0 соответствует значению false , а ненулевое (любое другое) значение соответствует значению true .

функция , выполняемая ими, несколько сложнее, чем в случае элемента И или элемента ИЛИ. Все входы элементов Исключающее ИЛИ равноправны, однако ни один из входов не может заблокировать другие входы, установив выходной сигнал в уровень единицы или нуля. Таблица 4.1. Таблица истинности двухвходовых элементов исключающего ИЛИ
Вход 1 Вход 2 Выход
0 0 0
0 1 1
1 0 1
1 1 0


Рис. 4.1.

Под функцией Исключающее ИЛИ понимается следующее: единица на выходе появляется тогда, когда только на одном входе присутствует единица . Если единиц на входах две или больше, или если на всех входах нули, то на выходе будет нуль. Таблица истинности двухвходового элемента Исключающее ИЛИ приведена в табл. 4.1. Обозначения, принятые в отечественных и зарубежных схемах, показаны на рис. 4.1. Надпись на отечественном обозначении элемента Исключающее ИЛИ "=1" как раз и обозначает, что выделяется ситуация, когда на входах одна и только одна единица .

Элементов Исключающее ИЛИ в стандартных сериях немного. Отечественные серии предлагают микросхемы ЛП5 (четыре двухвходовых элемента с выходом 2С), ЛЛ3 и ЛП12, отличающиеся от ЛП5 выходом ОК. Слишком уж специфическая функция реализуется этими элементами.

С точки зрения математики, элемент Исключающее ИЛИ выполняет операцию так называемого суммирования по модулю 2. Поэтому эти элементы также называются сумматорами по модулю два. Как уже отмечалось в предыдущей лекции, обозначается суммирование по модулю 2 знаком плюса, заключенного в кружок.

Основное применение элементов Исключающее ИЛИ, прямо следующее из таблицы истинности , состоит в сравнении двух входных сигналов. В случае, когда на входы приходят две единицы или два нуля (сигналы совпадают), на выходе формируется нуль (см. табл. 4.1) . Обычно при таком применении на один вход элемента подается постоянный уровень, с которым сравнивается изменяющийся во времени сигнал, приходящий на другой вход. Но значительно чаще для сравнения сигналов и кодов применяются специальные микросхемы компараторов кодов , которые будут рассмотрены в следующей лекции.

В качестве сумматора по модулю 2 элемент Исключающее ИЛИ используется также в параллельных и последовательных делителях по модулю 2, служащих для вычисления циклических контрольных сумм. Но подробно эти схемы будут рассмотрены в лекциях 14,15.

Важное применение элементов Исключающее ИЛИ - это управляемый инвертор (рис. 4.2) . В этом случае один из входов элемента используется в качестве управляющего, а на другой вход элемента поступает информационный сигнал. Если на управляющем входе единица , то входной сигнал инвертируется, если же нуль - не инвертируется. Чаще всего управляющий сигнал задается постоянным уровнем, определяя режим работы элемента, а информационный сигнал является импульсным. То есть элемент Исключающее ИЛИ может изменять полярность входного сигнала или фронта, а может и не изменять в зависимости от управляющего сигнала .


Рис. 4.2.

В случае, когда имеется два сигнала одинаковой полярности (положительные или отрицательные), и при этом их одновременный приход исключается, элемент Исключающее ИЛИ может быть использован для смешивания этих сигналов (рис. 4.3) . При любой полярности входных сигналов выходные сигналы элемента будут положительными. При положительных входных сигналах элемент Исключающее ИЛИ будет работать как элемент 2ИЛИ, а при отрицательных он будет заменять элемент 2И-НЕ. Такие замены могут быть полезны в тех случаях, когда в схеме остаются неиспользованными некоторые элементы Исключающее ИЛИ. Правда, при этом надо учитывать, что задержка распространения сигнала в элементе Исключающее ИЛИ обычно несколько больше (примерно в 1,5 раза), чем задержка в простейших элементах И, И-НЕ, ИЛИ, ИЛИ-НЕ.

На практике наиболее часто используют двухвходовые элементы «исключающее ИЛИ. На рис. 1 показано условное графическое обозначение элемента без инверсии и его таблица состояний. По простому, суть данного элемента сводится к следующему, сигнал на выходе появляется только в том случае, когда логические уровни на входах не одинаковые.

Схема выделения фронта и среза импульса

В данной схеме три элемента «Исключающий ИЛИ» используются для задержки импульсов. DD1.4 — суммирующий. Выходные импульсы имеют стабильные фронты и срезы. Длительность каждого выходного импульса равна утроенному времени задержки переключения каждого из трех элементов. Временной промежуток между фронтами выходных импульсов равен длительности входного импульса. Так же это устройство удваивает частоту входного сигнала.

Есть еще одно интересное свойство «Исключающее ИЛИ». Если на один из входов подать постоянный «0», то сигнал на выходе элемента будет повторять входной сигнал, а если постоянный «0» поменять на постоянную «1», то выходной сигнал уже будет инверсией входного.

Иногда появляется необходимость получить элемент «исключающее ИЛИ» из отдельных стандартных логических элементов. Примером может служить схема элемента «исключающее ИЛИ» реализованная на четырех элементах 2-И-НЕ. На рисунке 3 показана схема «исключающее ИЛИ» в четырех ее состояниях. Здесь показаны все возможные логические уровни на каждом из используемых логически элементов 2-И-НЕ.

Такие элементы входят в схему . В данной схеме элемент «Исключающий ИЛИ» выполнен на четырех элементах 2-И-НЕ, входящих в один корпус микросхемы К561ЛА7.

Формирователь дискретного сигнала с разностной частотой

Схема формирователя показана на рисунке 4. Здесь логический элемент «исключающее ИЛИ» также реализован на четырех элементах 2-И-НЕ.

На входы 1 и 2 формирователя падают импульсы прямоугольной формы (см. графики 1 и 2), которые различаются частотой следования. Узел на логических элементах DD1.1-DDI.4 перемножает эти сигналы. Выходной импульсный сигнал (график 3) с элемента DD1.4 подается на интегрирующую цепь R3, С1, преобразующую его в сигнал треугольной формы (график 4) с частотой, равной разности частот входных сигналов, а ОУ DA1 преобразует полученный сигнал в меандр (см. график 5). Резистором R1 регулируют длительность положительной и отрицательной полуволн выходного сигнала. Очень интересная схема. Радиоконструктору, есть над чем подумать. Например, сигнал, показанный на третьем графике, является сигналом ШИМ синусоиды.
Конечно диапазон использования элементов «исключающее ИЛИ» намного шире. Я привел здесь на мой взгляд более интересные для радиолюбителей.

В этой статье мы поговорим о некоторых битовых операциях. Рассмотрим основные из них: XOR (исключающее ИЛИ), AND (И), NOT (НЕ) а также OR (ИЛИ).

Как известно, минимальной единицей измерения информации является бит , который хранит одно из 2-х значений: 0 (False , ложь) либо 1 (True , истина). Таким образом, битовая ячейка может одновременно находиться лишь в одном из двух возможных состояний.

Для манипуляций с битами используют определённые операции - логические или булевые . Они могут применяться к любому биту, вне зависимости от того, какое у него значение - ноль или единица. Что же, давайте посмотрим на примеры использования трёх основных логических операций.

Логическая операция AND (и)

AND обозначается знаком & .

Оператор AND выполняется с 2-мя битами, возьмём, к примеру, a и b. Результат выполнения операции AND равен 1, если a и b равняются 1. В остальных случаях результат равен 0. Например, с помощью AND вы можете узнать, чётное число или нет.

Посмотрите на таблицу истинности операции AND:

Логическая операция OR (ИЛИ)

Обозначается знаком | .

Оператор OR также выполняется с 2-мя битами (a и b). Результат равен 0, если a и b равны 0, иначе он равен 1. Смотрим таблицу истинности.

Логическая операция XOR (исключающее ИЛИ)

Оператор XOR обозначается ^ .

XOR выполняется с 2-мя битами (a и b). Результат выполнения операции XOR (исключающее ИЛИ ) равен 1, когда один из битов b или a равен 1. В остальных ситуациях результат применения оператора XOR равен 0.

Таблица истинности логической операции для XOR (исключающее ИЛИ) выглядит так:

Используя XOR (исключающее ИЛИ), вы можете поменять значения 2-х переменных одинакового типа данных, не используя временную переменную. А ещё, посредством XOR можно зашифровать текст, например:

String msg = "This is a message"; char message = msg.toCharArray(); String key = ".*)"; String encryptedString = new String(); for(int i = 0; i< message.length; i++){ encryptedString += message[i]^key.toCharArray(); }

Согласен, XOR - далеко не самый надёжный метод шифрования, но это не значит, что его нельзя сделать частью какого-либо шифровального алгоритма.

Логическая операция NOT (НЕ)

Это побитовое отрицание, поэтому выполняется с одним битом и обозначается ~ .

Результат зависит от состояния бита. Если он в нулевом состоянии, то итог операции - единица и наоборот. Всё предельно просто.

Эти 4 логические операции следует запомнить в первую очередь, т. к. с их помощью можно получить практически любой возможный результат. Также существуют такие операции, как << (побитовый сдвиг влево) и >> (побитовый сдвиг вправо).

Команда XOR в Ассемблере выполняет операцию исключающего ИЛИ между всеми битами двух операндов. Результат операции XOR записывается в первый операнд. Синтаксис:

XOR ПРИЁМНИК, ИСТОЧНИК

Инструкция XOR всегда сбрасывает CF и OF, а также (в зависимости от результата) изменяет флаги SF, ZF и PF. Значение флага AF может быть любым - оно не зависит от результата операции.

ПРИЁМНИК может быть одним из следующих:

  • Область памяти (MEM)

ИСТОЧНИК может быть одним из следующих:

  • Область памяти (MEM)
  • Регистр общего назначения (REG)
  • Непосредственное значение - константа (IMM)

С учётом ограничений, которые были описаны выше, комбинации ПРИЁМНИК-ИСТОЧНИК могут быть следующими:

REG, MEM MEM, REG REG, REG MEM, IMM REG, IMM

Операция исключающего ИЛИ

При выполнении операции исключающего ИЛИ значение результата будет равно 1, если сравниваемые биты отличаются (не равны). Если же сравниваемые биты имеют одинаковое значение, то результат будет равен 0.

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

Но, так как любая пара неодинаковых битов это 0 и 1, то операция логического ИЛИ в результате даст 1.

Таблица истинности исключающего ИЛИ

Таблица истинности XOR приведена ниже:

0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0

Особенности операции XOR

Операция XOR обладает свойством реверсивности. Если её выполнить дважды с одним и тем же операндом, то значение результата инвертируется. То есть если два раза выполнить эту операцию между битами X и Y , то в конечном результате мы получим исходное значение бита Х .

0 XOR 0 = 0 XOR 0 = 0 0 XOR 1 = 1 XOR 1 = 0 1 XOR 0 = 1 XOR 0 = 1 1 XOR 1 = 0 XOR 1 = 1

Это свойство можно использовать, например, для простейшего шифрования данных (об этом как-нибудь в другой раз).

Проверка флага чётности после операции XOR

Команда XOR работает с 8-, 16- и 32-разрядными операциями.

Иногда есть необходимость после выполнения операции проверить флаг чётности PF, для того, чтобы узнать, какое количество единичных битов (чётное или нечётное) содержится в младшем байте результата (это бывает необходимо не только в случае выполнения операции XOR, но и при выполнении других арифметических и логических операций).

Если флаг чётности установлен, то в результате получилось чётное количество единичных битов. Иначе флаг будет сброшен.

Можно также просто проверить на чётность любое число, не меняя значения результата. Для этого надо выполнить команду XOR с нулевым значением. То есть в ПРИЁМНИКЕ должно быть проверяемое число, а в ИСТОЧНИКЕ должен быть ноль. А затем надо проверить флаг чётности. Пример:

AL, 10110101b ;Поместить в AL число с нечётным;количеством единичных битов (5) XOR AL, 0 ;При этом флаг чётности PF не;устанавливается (PO) MOV AL, 10110111b ;Поместить в AL число с чётным;количеством единичных битов (6) XOR AL, 0 ;При этом флаг чётности PF ;будет установлен (PE)

В отладчиках обычно для обозначения чётного количества единиц в полученном результате используется сокращение PE (Parity Even), а для нечётного - PO (Parity Odd).

Чётность в 16-разрядных словах

Как уже было сказано, флаг чётности устанавливается в зависимости от количества единиц, содержащихся в младшем байте результата. Чтобы проверить чётность 16-разрядного операнда, надо выполнить команду XOR между старшим и младшим байтом этого числа:

MOV AX, 64C1h ;0110 0100 1100 0001 - 6 единичных битов XOR AH, AL ;Флаг чётности будет установлен

Таким нехитрым способом 16-разрядный операнд разбивается на два байта (2 группы по 8 битов), и при выполнении команды XOR единичные биты, находящиеся в соответствующих разрядах двух 8-разрядных операндов, не будут учитываться. Потому что соответствующий бит результата равен нулю.

Команда XOR удаляет из результата любые пересекающиеся единичные биты двух 8-разрядных операндов и добавляет в результат непересекающиеся единичные биты. То есть чётность полученного нами 8-разрядного числа будет такой же, как и чётность исходного 16-разрядного числа.

0110 0100 1100 0001 - исходное 16-разрядное число 0 XOR 1 = 1 1 XOR 1 = 0 1 XOR 0 = 1 0 XOR 0 = 0 0 XOR 0 = 0 1 XOR 0 = 1 0 XOR 0 = 0 0 XOR 1 = 1

В результате 4 единицы, то есть флаг PF будет установлен

Чётность в 32-разрядных двойных словах

Ну а если надо определить чётность в 32-разрядном числе?

Тогда число разбивается на четыре байта, и поочерёдно с этими байтами выполняется операция исключающего ИЛИ.

Например, мы разбили 32-разрядное число B на четыре байта B0 , B1 , B2 , B3 , где В0 - это младший байт.

Тогда для определения чётности числа В нам надо будет использовать следующую формулу:

B0 XOR B1 XOR B2 XOR B3

Но в ассемблере такая запись недопустима. Поэтому придётся немного подумать.

Ну и напоследок о происхождении мнемоники XOR . В английском языке есть слово eX ception - исключение. Сокращением от этого слова является буква Х (так повелось). Вы наверняка встречали такое в рекламе или в названии продуктов, производители которых претендуют (ну или думают, что претендуют) на исключительность. Например, Лада XRAY, Sony XPeria и т.п. Так что XOR - это аббревиатура, собранная из двух слов - eX ception OR - исключающее ИЛИ.

В продолжение темы:
Windows

Вероятнее всего вы находитесь в поисках нового, более свежего вида для вашего сайта. Если это так, то у меня для вас есть замечательная новость. В этой подборке вы найдете...

Новые статьи
/
Популярные