Я@R

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Я@R » Претечи » Мир логики


Мир логики

Сообщений 1 страница 6 из 6

1

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

В самом начале определим понятие бит, как единицу информации, принятой в двоичной логике. Обычно в логике он принисает два значения - истина и ложь. При записи в прогах это соответствует значениям - true и false, или в Си-шином представлении, как - 1 и 0. Фактически под значение истина в проге - логическое значение принимает любое слово отличное от нуля. Т.е. если мы при оперировании переменной в условных операциях в качестве аргумента подставляем значение отличное от нуля, то логическая операция считает эту величину - истиной. Это у многих вызывает некий супорт, и поэтому частенько в логических выражениях встречается некая такая последовательность на проверку аргумента по равенству нулю, что в конце концов в машинных кодах компьютера вырождается в неэффективность

Пример не-логичности: взято из плагина движка WP - WP-Optimize

Код:
if(!$comments==NULL||!$comments==0){
.........................
} else

Фактически - сначала интерпретатор заставляют перетранслировать два нелогичных сравнений (тратя время и ресурсы), которые в принципе есть одна и та же проверка одного и того же аргумента, ибо значения при операциях логики всегда приводятся по правилу приведенному выше к двум противоположным по-сути значениям, а затем в процессоре дважды выполняют одинаковые действия, и наконец результат объединяется по логическому ИЛИ. Как я понимаю автор плагина хотел фразой: (!$comments==0) сказать, что надо вызвать действия при условии не равенства нулю аргумента, хотя проверка на нуль в компьютерах с любой системой команд - абсурдна, ибо это просто есть внутрення операция АЛУ любого процессора, которая есть суть проверки состояния результата, а потом это утверждение еще и проверяется, что оно не есть нуль. Фактически эта фраза в логичной записи правильно должна быть трансформирована в такую - ($comments), ибо как я раньше писал, любое значение логики отличное от по-битного нуля в аргументе есть истина.
Расшифровываю для особливо тупых - значения аргумента равные === 1,89,966755: есть истина, а значение === 0: есть ложь, и все другие операции по проверке есть просто обыкновенный и тупой мазохизм от недоучек- бакалавров и аспирантшизы
Сначала рассмотрим какие операции в природе есть. Их всего, в качестве основных, принято три+1.
Эта плюс 1 - операция, построенная на основных , но она все же имеет самостоятельное значение, так как стала основой при построении арифметической операции сложении, и может реализоваться по другому принципу, отличному от принципов реализации первых трех основных.

2

Основные операции

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

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

3

Битовая арифметика
Давай рассмотрим как в прогах обозначаются битовые и логические операции. А так же установим все из правила и порядок вычисления. Порядок вычисления логической функции, как и для арифметических операции имеет значение. Основными операторами, для которых вычисляются логические выражения в прогах, это условные выборки и циклы. Подставляя в них такие выражения, ты сможешь управлять ходом решения поставленой тобою задачи. Но так же можно использовать результат вычисления и явно, сохраняя его в переменной, а затем по необходимости определить ее использование, так же как и обычные другие переменные, имеющие численое или другие значения.
Порядок исполнения
1. !,~ - операция НЕ
2. <,<=,>,>= - логическое сравнение
3. ==,!=,===,!== - эквивалентность
4. & - битовая И
5. ^ - битовая Исключающая ИЛИ
6. | - битовая ИЛИ
7. &&,and - логическая И
8. xor - логическая Исключающая ИЛИ
9. ||,or - логическая ИЛИ

Нас интересуют в основном битовые и логические операции. Приведенный порядок исчисления логических выражений для операций сравнения и эквивалентности, лишь дает информацию об из порядке или приоритете в общей последовательности исчисления выражения. Ты можешь заметить что даже в написании есть разница в публике между логической и битовой операцией. Возникает резонный вопрос - "о разнице их применения". Битовая операция - строгая, и применяется если тебе надо вычислить результат конкретного бита в слове, для логической операции работает механизм приведения к логическому значению (оно еще имеет название - булево), по принципу о котором я писал в приамбуле заметки. И чтобы различить их в нотации (паблика) применяется разные обозначения, но логика исчисления всегда одна и таже.
Для операции НЕ - так же обозначение имеет две нотации. Символ !- означает логическое НЕ, а символ ~- побитовую инверсию всего слова, что не одно и то же.

4

Давайте рассмотрим правила исчисления логических и по-битовых операций

Операция НЕ

Код:
$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;

5

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

На самом деле это так и есть. И мы приходим к некоторой первой форме преобразования

Код:
 1. !($A||$B) == !$A&&!$B
 2. !($A&&$B) == !$A||!$B

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

6

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

Код:
$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)

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


Вы здесь » Я@R » Претечи » Мир логики