Давай рассмотрим как в прогах обозначаются битовые и логические операции. А так же установим все из правила и порядок вычисления. Порядок вычисления логической функции, как и для арифметических операции имеет значение. Основными операторами, для которых вычисляются логические выражения в прогах, это условные выборки и циклы. Подставляя в них такие выражения, ты сможешь управлять ходом решения поставленой тобою задачи. Но так же можно использовать результат вычисления и явно, сохраняя его в переменной, а затем по необходимости определить ее использование, так же как и обычные другие переменные, имеющие численое или другие значения.
- Порядок исполнения
- !,~ - операция НЕ
- <,<=,>,>= - логическое сравнение
- ==,!=,===,!== - эквивалентность
- & - битовая И
- ^ - битовая Исключающая ИЛИ
- | - битовая ИЛИ
- &&,and - логическая И
- xor - логическая Исключающая ИЛИ
- ||,or - логическая ИЛИ
Нас интересуют в основном битовые и логические операции. Приведенный порядок исчисления логических выражений для операций сравнения и эквивалентности, лишь дает информацию об из порядке или приоритете в общей последовательности исчисления выражения. Ты можешь заметить что даже в написании есть разница в публике между логической и битовой операцией. Возникает резонный вопрос - "о разнице их применения". Битовая операция - строгая, и применяется если тебе надо вычислить результат конкретного бита в слове, для логической операции работает механизм приведения к логическому значению (оно еще имеет название - булево), по принципу о котором я писал в статье - Мир Логики. И чтобы различить их в нотации (паблика) применяется разные обозначения, но логика исчисления всегда одна и таже.
Для операции НЕ - так же обозначение имеет две нтации. Символ !- означает логическое НЕ, а символ ~- побитовую инверсию всего слова, что не одно и то же.
Давайте рассмотрим правила исчисления логических и по-битовых операций
Операция НЕ
$R = !$A;
если $A = 0, то $R = 1;
иначе если $A = 1, то $R = 0;
Операция И
$R = $A && $B;
если $A == $B == 1, то $R = 1;
иначе $R = 0;
Операция ИЛИ
$R = $A || $B;
если $A == $B == 0, то $R = 0;
иначе $R = 1;
Можно заметить, что в операциях И и ИЛИ наблюдается некая симметрия. т.е как бы операция И есть суть операции ИЛИ, но через инверсию, и наоборот.
На самом деле это так и есть. И мы приходим к некоторой первой форме преобразования
1. !($A||$B) == !$A&&!$B
2. !($A&&$B) == !$A||!$B
Фактически мы три операции превратили в две, тем самым ускорив вычисление логического выражения, заменив инверсии и логику, на логику инверсии. Эта формула работает для любого числа аргументов
Операция исключающая ИЛИ
$R = $A xor $B
== $A && !$B || !$A && $B;
если $A == $B, то $R = 0;
иначе $R = 1;
Следующая пара формул выполняет свертку аргументов
1 = $A || 1; $A = $A || 0;
0 = $A && 0; $A = $A && 1;
1 = $A || !$A; $A = $A || $A;
0 = $A && !$A; $A = $A && $A;
И наконец последнии два преобразования, которые позволят тебе существенно минимизировать любые логические выражения
$A & ($B | $C) == ($A & $B)|($A & $C)
$A | ($B & $C) == ($A | $B)&($A | $C)
Очень интересные формулы. Особо превлекательна вторая формула свертки. На первый взгляд кажется что эта операция, для тех кто помнит алгебру арифметических выражений, невозможной. Но в булевой алгебре - это выражение имеет право на жизнь.
Продолжение следует