И для побитовых операций




Putting it all together

 

This rest of this document deals with how the above is used in conjunction with programming.

 

Boolean algebra

 

The first thing that I should point out is that the last two Boolean operators (A implies B, if and only if) are normally only used for program specification (such as in the specification language Z) and not in everyday programming. The next thing to point out is that only six of the remaining operators are obviously implemented in QB. They are AND, OR, NOT, XOR, IMP and EQV. Do not despair because XNOR is implemented, but with a different name, and the operators NAND and NOR

are easily implemented with the use of parentheses and the operators AND, OR and NOT. If you check out the truth table for XNOR you will see that the results are the same as for the equivalence operator. Both NAND and NOR are almost as easy to implement as XNOR. All you need to do is to use the inversion operator (NOT) on the output of either the AND (NAND) operation or the OR (NOR) operation as illustrated below

.

NAND NOT(A AND B)

NOR NOT(A OR B)

 

One thing to be careful of is the fact that NOT A AND NOT B is equivalent to NOT(A OR B), and NOT A OR NOT B is equivalent to NOT(A AND B). This is because both NAND and NOR invert the OUTPUT of the AND and OR operators respectively, and not the input.

 

 

Bitwise Operations

 

While more commonly associated with assembly language programming, the manipulation of the individual bits (from BInary digITS) in a number do have thier uses in QB. For example if you wish to ensure that a number that is passed is less than 256, it is much quicker to bitwise AND the test-value with &HFF (255 decimal) than to find the modulus of the division of the test-value by &H100 (256 decimal), or to put it another way

TestValue = TestValue AND 255

is much faster than

TestValue = TestValue MOD 256

 

Bitwise AND

The action of the bitwise AND is to 'mask' the desired bits and to drop all others. For example, using the above variable and its associated mask. If TestValue initially has the value of 511 decimal,

1FF hex, 0000000111111111 binary and we AND it with FF hex, 255

decimal, 0000000011111111 binary the result will also be FF Hex.

 

AND

=

 

This is especially useful when you are using interrupts and you need to load one of the registers with a guaranteed byte value (as opposed to a word value).

 

 

Bitwise NOT

This operation performs what is termed an inversion - all the bits that were originally 0 become 1 and the bits that were 1 become 0. So if we have a byte with a value of 170 decimal (AA Hex, 10101010 binary) and we perform a bitwise NOT operation on it we get the result

of 85 (55 Hex, 01010101 binary).

 

NOT 10101010

=

 

Bitwise (inclusive) OR

The action of the bitwise OR operator is as follows. Each bit in the result will be set to 1 unless the corresponding bit in both input values is a 0. This is best illustrated with an example. Say we have a value of 170 decimal (AA Hex, 10101010 binary) and we OR it with a value of 87 decimal (57 Hex, 01010111 binary) we will get a result of 255 (FF Hex, 11111111 binary).

 

OR

=

 

Bitwise XOR

This operator has a more complex action the preceding one. Each bit in the result will be set to one if the corresponding bits in the input values are not equal. So taking the same values as used in our

example for the bitwise (inclusive) OR operator we get a result of decimal (FD Hex, 0000000011111101 binary).

 

XOR

=

 

This can be useful where we wish to have a value that alternately switches between true and false in QB where true is represented by -1 decimal. This is because the scheme adopted to represent negative numbers (called 2's compliment) means that at the binary level -1 is represented by 1111111111111111. To illustrate this here is a small program.

 

Test% = 0

DO

Test% = Test% XOR -1

IF Test% THEN

PRINT "TRUE"

ELSE

PRINT "FALSE"

END IF

LOOP

 

Simply run this and when you have a nice long list of text on screen, hit control-break to see that it has worked.

 

Some other areas where bitwise XOR is used are in graphics (as are the other bitwise operations mentioned here), simple checksums and simple encryption and to efficiently swap whole values in those languages that don't have a swap command.

 

NIGEL TRAVES (9/1996 - Revised 6/1997 - revised for QB 1/1998)

 

Булева Алгебра

Булева алгебра имеет дело с формальной логикой и рассуждениями, результатом которых может стать одно из двух возможных значений: Истина или Ложь. В Quick Basic эти два значения представлены числами –1 и 0 соответственно. Однако в операциях побитового сравнения Истина представлена цифрой 1. Эти два значения генерируются путем сравнения двух не булевых значений. Существует шесть видов сравнения, для каждого из которых есть свой собственный оператор. Вот эти шесть видов сравнений: равенство(=), неравенство (<>), больше чем (>), меньше чем (<), больше чем или равно (>=), меньше чем или равно (<=).

 

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

 

Стандартные таблицы истинности обычно имеют один или два булевых значения слева (обозначаются буквами А или А и В), которыми обозначают входящие данные, и единичным значением справа (обозначают буквой В или С), которым обозначают исходящие данные. Для каждого оператора приведены две таблицы, та что слева – чисто для логических операций, та что справа для операций побитового сравнения.

NOT – единичный булевый оператор, который получает и возвращает единичное значение. Суть его сводится к тому что значение на его выходе противоположно его значению на входе то есть Истина становится Ложью и наоборот.

NOT
A C
FALSE TRUE TRUE FALSE

 

NOT
A C
   
   

 

 

Остальные восемь операторов являются двоичными, в том смысле что они оперируют с двумя входящими значениями, и возвращают одно исходящее

 

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

AND
A B C
FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE FALSE FALSE FALSE TRUE

 

AND
A B C
0 0 0 1 1 0 1 1  

 

 

ИЛИ – нестрогое ИЛИ значение на выходе этого оператора – Ложь, только если оба значения на входе – ложны. Альтернативное определение: Значение на выходе – Истина, только в том случае если одно из значений на входе истинно, или оба значения на входе истинны.

OR
A B C
FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE

 

OR
A B C
0 0 0 1 1 0 1 1  

 

 

XOR – строгое ИЛИ. Значение на выходе этого оператора Истина, только если одно из входящих значений является истинным, а другое ложным. Альтернативное определение: Значение на выходе Истина, только в том случае если одно из входящих значений истинно, но не они оба.

 

Exclusive OR
A B C
FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE FALSE

 

XOR
A B C
0 0 0 1 1 0 1 1  

 

 

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

NOT AND
A B C
FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE

 

NAND
A B C
0 0 0 1 1 0 1 1  

 

 

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

NOT OR
A B C
FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE FALSE FALSE

 

NOR
A B C
0 0 0 1 1 0 1 1  

 

 

XNOR – НЕ СТРОГОЕ ИЛИ. Действие этого оператора таково что значение на выходе становится ложным только в том случае если одно из входящих значений истинно, а другое ложно. Т е, действие его обратно противоположно действию оператора XOR. Является логическим эквивалентом мат. Знака =.

NOT Exclusive OR
A B C
FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE FALSE FALSE

 

XNOR
A B C
0 0 0 1 1 0 1 1  

 

 

 

А ЗНАЧИТ В. Действие этого оператора: возвращает значение Ложь на выходе только при входных значениях: А- Истина; В – Ложь.В QB это оператор IMP. (Примечание: оператор применяется в формальной логике булевой алгебры. Фраза A ===> B, произносится как «А есть В», или «если А тогда В». Этим оператором мы пользуемся когда утверждаем, что одно предложение подразумевает другое. Следует учесть что это математический термин, и он не часто встречается в повседневной речи или в программировании. В «чистой» математике этот аоператор обычно можна встретить в начале (или в начале и конце) уравнения.

A IMPLIES B
A B C
FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE

 

===>
A B C
0 0 0 1 1 0 1 1  

 

 

 

ЕСЛИ И ТОЛЬКО ЕСЛИ – операция также известна как эквиваленция. Возвращает на выходе значение Ложь, только в том случае если, оба значения на входе, противоположны одно другому.

В Бейсике это оператор EQV.

IF AND ONLY IF
A B C
FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE FALSE TRUE

 

<==>
A B C
0 0 0 1 1 0 1 1  

 

 

До сих пор мы с вами имели дело с простыми логическими выражениями, такими как: C = A AND B, но как и во всей остальной алгебре, используя скобки, из простых выражений можно составлять более комплексные, например: X = A OR (B AND C). Некоторые из таких сложных выражений могут быть упрощены с помощью определенных правил, которые в математике называются законами. Здесь мы рассмотрим только те законы которые актуальны с точки зрения программиста. Где это возможно, я постараюсь использовать «бытовую» терминологию.

 

 

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

LET Q = 2

X = (A AND B) OR (C XOR D) OR (Q^0 = 1)

Можно свести к Х = Истина.

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

LET Q = 2

X = (A OR B) AND (C XOR D) AND (Q^0 <> 1)

Можно свести к X = ложь.

 

Следующий закон гласит что если у нас есть выражение такое как:

X = A OR (A AND B),

или

X = A AND (A OR B)

То выражение может быть упрощено до X = A.

 

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

X = A OR false,

или такое

X = A AND true,

то его можно упростить до X = A.

 

___________________________________________________________________________

 

Подведение итогов

 

Оставшаяся часть документа разъясняет как все изложенное выше относится к программированию.

 

Алгебра логики

 

……

……

Следует отметить что: в языке QuickBasic из всех перечисленных нами логических операторов, явно представлены только шесть. Вот они: AND, OR, NOT, XOR, IMP и EQV. Использование XNOR (не строгое или), возможно, но под другим именем. Операторы NAND и NOR, можно легко заменить при помощи скобок и операторов AND, OR и NOT. Если вы сравните таблицы истинности для операторов XNOR и EQV, то найдете их тождественными. Чтобы пользоваться операторами NAND и NOR, вам достаточно поставить оператор NOT перед операторами AND или OR, как показано ниже

 

NAND NOT(A AND B)

NOR NOT(A OR B)

 

 

Еще одна вещь, на которую важно обратить внимание это то, что выражение NOT A AND NOT B эквивалентно выражению NOT(A OR B), а NOT A OR NOT B эквивалентно NOT(A AND B). Это потому что действия операторов NAND и NOR делают противоположными, результаты действий операторов AND и OR соответственно, (но не их входящие данные).

 

Операции с битами

У большинства, операции с индивидуальными битами ассоциируются с языком ассемблера. Однако в подавляющем большинстве случаев, те же операции можно, выполнить средствами QuickBasic. Например вам надо знать что не превышает ли число находящееся в переменной, значения 256. Эффективный способ это, разложить переменную на биты, и сравнить полученное значение с &HFF (25510). Другой способ, но менее эффективный, это получить остаток от деления переменной на &H100 (25610). Пример:

TestValue = TestValue AND 255

Выполняется быстрее чем

TestValue = TestValue MOD 256

 

 

И для побитовых операций

Действие оператора И применительно к побитовым операциям таково что он «маскирует» определенные биты, и отбрасывает все остальные. Пример, вышеприведенная переменная и ее ассоциированная маска. Если переменная TestValue равна 51110, (1FF16, 00000001111111112), и мы конъюнктируем ее на 25510 (FF16, 00000000111111112), то получим 25510 (FF16)

 

AND

=

 

Этот способ особенно полезен если вы используете прерывания, и вам требуется загрузить один из регистров с точно известным размером в один байт (не размером в слово1).

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-10-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: