Light-electric.com

IT Журнал
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Логические операции в программировании

Основные логические операции. AND, NOT, OR и XOR (исключающее или)

В этой статье мы поговорим о некоторых битовых операциях. Рассмотрим основные из них: 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 можно зашифровать текст, например:

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

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

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

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

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

Урок №43. Логические операторы: И, ИЛИ, НЕ

Обновл. 30 Дек 2019 |

В то время как операторы сравнения используются для проверки конкретного условия: ложное оно или истинное, они могут проверить только одно условие за определённый промежуток времени. Но бывают ситуации, когда нужно протестировать сразу несколько условий. Например, чтобы узнать, выиграли ли мы в лотерею, нам нужно сравнить все цифры купленного билета с выигрышными. Если в лотерее 6 цифр, то нужно выполнить 6 сравнений, все из которых должны быть true.

Также иногда нам нужно знать, является ли хоть одно из нескольких условий истинным. Например, мы не пойдём сегодня на работу, если больны или слишком устали, или если выиграли в лотерею Нам нужно проверить, является ли хоть одно из этих 3 условий истинным. Как это сделать? С помощью логических операторов! Они позволяют проверить сразу несколько условий за раз.

В C++ есть 3 логических оператора:

Логический оператор НЕ

Если операндом является true, то после применения логического НЕ результатом будет false. Если же операнд до применения оператора НЕ является false, то после его применения — станет true. Другими словами, логический оператор НЕ меняет результат с true на false и наоборот. Он часто используется в условных выражениях:

Следует помнить, что логический оператор НЕ имеет очень высокий уровень приоритета. Новички часто совершают следующую ошибку:

Но х ведь не равно у , как это возможно? Поскольку приоритет логического оператора НЕ выше, чем приоритет оператора равенства, то выражение ! х == у обрабатывается как (! х) == у . Так как х — это 5 , то !x — это 0 . Условие 0 == у ложное, поэтому выполняется часть else!

Напоминание: Любое ненулевое целое значение в логическом контексте является true. Так как х = 5 , то х вычисляется как true, а вот !x = false , т.е. 0 . Использование целых чисел в логических операциях подобным образом может запутать не только пользователя, но и самого разработчика, поэтому мы не советуем так делать!

Правильный способ написания программы выше:

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

Логический оператор ИЛИ

Если хоть одно из двух условий является истинным, то логический оператор ИЛИ является true.

Рассмотрим следующую программу:

Вы можете соединить сразу несколько условий:

value1 || (value2 && value3)

(value1 || value2) && value3

Хорошей практикой является использование круглых скобок с операциями. Это предотвратит ошибки приоритета, увеличит читабельность кода и чётко даст понять компилятору, как следует обрабатывать выражения. Например, вместо того, чтобы писать value1 && value2 || value3 && value4 , лучше записать (value1 && value2) || (value3 && value4) .

Законы Де Моргана

Многие программисты совершают ошибку, думая, что !(x && y) — это то же самое, что и !x && !y . К сожалению, вы не можете «использовать» логическое НЕ подобным образом.

!(x && y) эквивалентно !x || !y
!(x || y) эквивалентно !x && !y

Другими словами, логические операторы И и ИЛИ меняются местами! В некоторых случаях, это даже полезно: улучшает читабельность.

Читать еще:  Как научиться программировать на c

А где же побитовое исключающее ИЛИ (XOR)?

Побитовое исключающее ИЛИ (XOR) — это логический оператор, который используется в некоторых языках программирования для проверки на истинность нечётного количества условий.

В C++ нет такого оператора. В отличии от логических И/ИЛИ, к XOR не применяется короткий цикл вычислений. Однако его легко можно сымитировать, используя оператор неравенства (!=):

Можно также расширить количество операндов:

Следует отметить, что приведенные выше шаблоны XOR работают только, если операнды логического типа данных (а не целочисленных типов). Если вы хотите, чтобы это работало и с целыми числами, то используйте оператор static_cast.

Форма XOR, которая работает и с другими типами данных (с помощью static_cast мы можем конвертировать любой тип данных в bool):

Какой результат следующих выражений?

(true && true) || false

(false && true) || true

(false && true) || false || true

(5 > 6 || 4 > 3) && (7 > 8)

Ответ

Примечание: В ответах объяснение выполняется с помощью стрелочки (=>). Например, (true || false) => true означает, что результатом выражения (true || false) является true .

(true && true) || false => true || false => true

(false && true) || true => false || true => true

(false && true) || false || true => false || false || true => false || true => true

(5 > 6 || 4 > 3) && (7 > 8) => (false || true) && false => true && false => false

!(7 > 6 || 3 > 4) => !(true || false) => !true => false

Курсы «C#.NET Developer»

Курсы «Java Developer»

Курсы «Frontend Developer»

Курсы «JavaScript Developer»

Курсы «Python Developer»

Курсы «Unity/Game Developer»

Поделиться в социальных сетях:

Урок №42. Операторы сравнения

Комментариев: 11

Подскажите пожалуйста, в соответствии со стандартом C++, оператор && всегда вычисляет оба операнда или только если первый из них возвращает true?

будут ли всегда выполнены обе функции f1() и f2()?

если f1() или f2() возвращает false, то будет выполнена только одна из функций, но какая именно стандартом не регламентируется

в данном выражении обе функции выполняться только в случае если первая будет true

Не перестаю восхищаться изложенному материалу! Огромное спасибо за проделанную работу!

Пожалуйста)) Мне приятно)

Про рекомендацию использовать скобки, если сомневаетесь в приоритете:
Страуструп крайне не рекомендует «украшать» код скобками… лучше или разобраться в приоритетах или разбить выражение на несколько, если есть хоть какие-то сомнения.
Вместо:

«Для реализации оператора XOR» используют ^. В с++ — это именно XOR, а не возведение в степень.

^ — это битовый оператор, а данная статья — о логических. Логического XOR в плюсах нет.
Для побитового исключения используется именно ^ . Для реализации же логического XOR использовать ^ крайне глупо потому что:
1. Сравнивая булевы значения будет очевидней(и эффективней, хоть эти наносекунды уже никого не интересуют) написать true != false , чем true ^ false .
2. В случае сравнения не булевых значений стоит продолжать существующую логику. На примере чисел: любое число, отличное от нуля — это true. Следовательно нельзя просто написать 1 ^ 2 — потому что эта операция вернет 3 , что интерпретируется, как true . Почему? Потому что любое не нулевое число должно восприниматься, как истина, следовательно 1 -> true , 2 -> true . результатом XOR между ними должен быть false . Таким образом доказываем неприминимость ^ , приходим к необходимости преобразования операндов в булевы значения и смотрим пункт 1.

^ — это побитовый оператор… ожидать от него поведения логического XOR — нарываться на потенциальные алгоритмические ошибки…
можно в качестве XOR использовать оператор != для логических выражений (тоже некорректно работает, если Вы ожидаете неявных преобразований типов)

Скажите, пожалуйста, почему в примере из урока нужно использовать if (!(x == y)), а не if (x != y) ?

Можно использовать и второй вариант, но != зачастую используется для реализации оператора XOR и в цепочке операндов, а !(==) для проверки на неравенство определенного выражения. Но использовать можно как первый, так и второй вариант — работать будет.

Основные логические операции. AND, NOT, OR и XOR (исключающее или)

В этой статье мы поговорим о некоторых битовых операциях. Рассмотрим основные из них: 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.

Читать еще:  Параллельное программирование на c в действии

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

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

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

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

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

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

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

Логические операторы

В JavaScript есть три логических оператора: || (ИЛИ), && (И) и ! (НЕ).

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

Давайте рассмотрим их подробнее.

Оператор «ИЛИ» выглядит как двойной символ вертикальной черты:

Традиционно в программировании ИЛИ предназначено только для манипулирования булевыми значениями: в случае, если какой-либо из аргументов true , он вернёт true , в противоположной ситуации возвращается false .

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

Существует всего четыре возможные логические комбинации:

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

Если значение не логического типа, то оно к нему приводится в целях вычислений.

Например, число 1 будет воспринято как true , а 0 – как false :

Обычно оператор || используется в if для проверки истинности любого из заданных условий.

Можно передать и больше условий:

ИЛИ «||» находит первое истинное значение

Описанная выше логика соответствует традиционной. Теперь давайте поработаем с «дополнительными» возможностями JavaScript.

Расширенный алгоритм работает следующим образом.

При выполнении ИЛИ || с несколькими значениями:

Оператор || выполняет следующие действия:

  • Вычисляет операнды слева направо.
  • Каждый операнд конвертирует в логическое значение. Если результат true , останавливается и возвращает исходное значение этого операнда.
  • Если все операнды являются ложными ( false ), возвращает последний из них.

Значение возвращается в исходном виде, без преобразования.

Другими словами, цепочка ИЛИ «||» возвращает первое истинное значение или последнее, если такое значение не найдено.

Это делает возможным более интересное применение оператора по сравнению с «чистым, традиционным, только булевым ИЛИ».

Получение первого истинного значения из списка переменных или выражений.

Представим, что у нас имеется ряд переменных, которые могут содержать данные или быть null/undefined . Как мы можем найти первую переменную с данными?

Если бы и currentUser , и defaultUser были ложными, в качестве результата мы бы наблюдали «unnamed» .

Сокращённое вычисление.

Операндами могут быть как отдельные значения, так и произвольные выражения. ИЛИ вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Этот процесс называется «сокращённым вычислением», поскольку второй операнд вычисляется только в том случае, если первого недостаточно для вычисления всего выражения.

Это хорошо заметно, когда выражение, указанное в качестве второго аргумента, имеет побочный эффект, например, изменение переменной.

В приведённом ниже примере x не изменяется:

Если бы первый аргумент имел значение false , то || приступил бы к вычислению второго и выполнил операцию присваивания:

Присваивание – лишь один пример. Конечно, могут быть и другие побочные эффекты, которые не проявятся, если вычисление до них не дойдёт.

Как мы видим, этот вариант использования || является «аналогом if «. Первый операнд преобразуется в логический. Если он оказывается ложным, начинается вычисление второго.

В большинстве случаев лучше использовать «обычный» if , чтобы облегчить понимание кода, но иногда это может быть удобно.

Оператор И пишется как два амперсанда && :

В традиционном программировании И возвращает true , если оба аргумента истинны, а иначе – false :

Логическая операция. Основные логические операции

Информатика как наука о методиках сбора, упорядочивания и обработки различных данных начинает своё развитие в середине ХХ столетия. Хотя некоторые историки считают, что начало формированию информатики было положено ещё в 17 веке, с изобретением первого механического калькулятора, большинство ассоциирует ее с эпохой более продвинутой вычислительной техники. В 40-е годы 20 века, с появлением первых компьютеров, информатика получила новый толчок в развитии.

Предмет изучения информатики

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

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

Типы операндов логических операций

Поскольку алгебра логики подразумевает работу над абстрактными понятиями, то и в качестве операндов всех логических операций выступают обобщённые типы данных. Классическими элементами, с которыми работает алгебра высказываний, являются высказывания, ложные или истинные. В электронике и программировании для описания этих терминов используют булевские переменные true и false или же целочисленные значения 1 (истина) и 0 (ложь). На комбинации этих значений, как бы невероятно это ни звучало, завязана работа самых сложных и масштабных систем. Весь программный код, который выполняется в компьютере или любом цифровом устройстве, динамически переводится в последовательность единиц и нулей – универсальный код, который может быть обработан любым процессором.

Читать еще:  Создание языка программирования на c

Виды логических операций

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

Наиболее простой и одной из самых известных функций булевой логики является функция отрицания. Эта простейшая логическая операция представляет собой противоположное значение входного операнда. В электронике это действие ещё иногда называется инверсией. К примеру, если проинвертировать суждение «истина», то результатом будет «ложь». И наоборот – отрицание значения «ложь» даст в результате значение «истина». Такая логическая операция в программировании очень часто используется для ветвления алгоритмов и реализации «выбора» последующего набора команд на основании уже имеющихся результатов или изменившихся условий.

Бинарные операции

В программировании и информатике используется ограниченный набор двоичных (бинарных) операций. Они получили своё название от латинского слова bi, означающего «два», и являются видом функций, которые принимают на входе два аргумента и в результате возвращают одно новое значение. Для описания всех функций булевой алгебры используются таблицы истинности.

Для чего они нужны

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

Наиболее часто используемыми функциями в информатике и вычислительной технике являются операции логического сложения (дизъюнкция) и логического умножения (конъюнкция).

Конъюнкция

Логическая операция «И» — это функция по выбору наименьшего из двух или n входных операндов. На входе эта функция может иметь два (бинарная функция), три значения (тернарная) или же неограниченное количество операндов (n-арная операция). При вычислении результата функции им станет наименьшее из предоставленных входных значений.

Аналогом в обычной алгебре является функция умножения. Поэтому операция конъюнкции часто называется логическим умножением. При записи функции знаком выступает либо знак умножения (точка) либо амперсант. Если составить таблицу истинности для этой функции, то станет видно, что функция принимает значение «истина», или 1, только при истинности всех входных операндов. Если же хотя бы один из входных параметров будет равен нулю, или значению «ложь», то результатом функции также будет «ложь».

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

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

Дизъюнкция

Логическая операция «ИЛИ» — вид булевой функции, который является аналогом алгебраического сложения. Другие названия этой функции – логическое сложение, дизъюнкция. Точно так же, как и операция логического умножения, дизъюнкция может быть бинарной (вычислять значение на основе двух аргументов), тернарной или n-арной.

Таблица истинности для данной логической операции является своего рода альтернативой конъюнкции. Логическая операция «ИЛИ» вычисляет максимальный результат среди предоставленных аргументов. Дизъюнкция принимает на выходе значение «ложь», или 0, только если все входные параметры поступают со значениями 0 («ложь»). В любом другом случае на выходе будет получено значение «истина», или 1. Для записи этой функции чаще всего используется математический знак сложения («плюс») или две вертикальные полосы. Второй вариант распространён в большинстве языков программирования и предпочтительнее, потому что позволяет чётко отделить логическую операцию от арифметической.

Общие свойства логических операций

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

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

Дополнительный аспект

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

Эти законы связывают пары логических операций с помощью функции логического отрицания, то есть позволяют выразить одну логическую операцию с помощью другой. К примеру, функцию отрицания конъюнкции можно выразить с помощью дизъюнкции отрицаний отдельных операндов. С помощью этих законов логические операции «И», «ИЛИ» могут быть взаимовыражены и реализованы с минимальными аппаратными затратами. Это свойство крайне полезно в схемотехнике, так как позволяет экономить ресурсы при расчёте и формировании микросхем.

Ссылка на основную публикацию
Adblock
detector