вторник, 17 августа 2010 г.

Битовая арифметика

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


    Порядок исполнения
  1. !,~ - операция НЕ

  2. <,<=,>,>= - логическое сравнение
  3. ==,!=,===,!== - эквивалентность
  4. & - битовая И
  5. ^ - битовая Исключающая ИЛИ
  6. | - битовая ИЛИ
  7. &&,and - логическая И
  8. xor - логическая Исключающая ИЛИ
  9. ||,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)

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


Продолжение следует