Рейтинг:  0 / 5

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

Логические операции и выражения незаменимы в условном операторе. О логических операциях уже было рассказано в Алгебра высказываний. А сейчас я расскажу по-подробнее об этой теме, но с программистической направленности. В Паскале есть следующие логические операции: and (*), or (V), xor (исключающее или) и not (отрицание). Все эти операции работают с логическим типом данных boolean (который принимает значение только true (истина) и false (ложь)).

Для начала рассмотрим таблицу истиности для всех этих операций.

a

b

a and b (a*b)

a or b (a V b)

a xor b ((a V b) and (not (a*b)))

not a (¬a)

not b (¬b)

T

T

T

T

F

F

F

T

F

F

T

T

F

T

F

T

F

T

T

T

F

F

F

F

F

F

T

T

где a - первая логическая переменная

b - вторая логическая переменная

T - истина

F - ложь

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

Мы же сейчас рассмотрим сокращенное вычисление логических выражений. Компьютер сразу же оптимизирует большинство логических выражений. Если в логическом выражении между логическими логическими переменные стоят логические операции (and, or, xor), то компьютер выполняет сокращенные вычисления. Так, если нам дано логическое выражение

var b:boolean:=true or (50/0=20);

То оно будет без каких-либо проблем посчитано. Хотя, дойдя до этой строки программа должна выдать исключение Деления на 0, но его не будет, так как компьютер определит, что между двумя переменными (true u (50/0=20)) стоит операция or, таблица истиности для которой уже была преведена выше, которая дает истину тогда, когда истинно одна из переменных, поэтому компьютер начнет разбирать данное выражение по частям. Он начнет проверять это выражения с первой переменной. Компьютер увидет, что значение первой переменной истинно, поэтому он не будет даже смотреть вторую переменную, а тем более ее высчитывать (а вообще компилятор, увидев тождественноистинное выражение, заменит на его на его логическое выражение).

Аналагичным образом компьютер будет рассматривать и другие логические операции. Так выражение

var b:boolean:=false and (5/0=1000);

будет откомпилировано без проблем, потому что основная операция «and», а значение первой логической переменной ложно-> какой бы ни было значение второй пременной все выражение будет ложным.

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

Побитовые операции

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

Большой плюс побитовых операций в том, что они работают не с дясятичными числами, а с их двоичным представлением (то как храниться оно в памяти). Из-за этого эти операции имеют ряд преимуществ.

Начнем с опирации and. Учтите, что в Паскале это не только логическая операция, но и побитовая операция. Она сравнивает числа в двоичном представлении и ее результатом будет десятичное число, двоичное представление которого есть в обеих числах.

1010 and 510 = 10102 and 1012 = 02=010

1010 and 610 = 10102 and 1102 = 102 =210

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

1010 or 510 = 10102 or 1012 = 11112 = 1510

1010 or 610 = 10102 or 1102 = 11102 = 1410

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

1010 xor 510 = 10102 xor 1012=11112=1510

1010 xor 610 = 10102 xor 1102 = 11002 = 1210

Операция shl. Это операция побитового сдвига влево. Оно добавляет справой стороны в доичном предсавлении значащие 0 столько раз, сколько указано. По сути, эта операция является операцией умножения на 2.

510 shl 210 = 1012 shl 210 =101002=2010.

Здесь 2 - это кол-во нужных значащих нулей, которое нужно добавить. Эту операцию можно представить в виде

x shl y = x*2y

Операция shr. Эта операция действует наоборот операции shl. Она убирает последние (справа) разряды в не зависимости от того, было ли в них что-либо записано.

510 shr 110 = 101 shr 110 = 102 = 210

. По сути, это операция является операцией деления на 2.

x shr y = x div (2)y

Где div - целочисленное деление.

Сейчас рассмотрим еще две операции, но они не являются побитовыми операциями - это div и mod.

Операция div - это целочисленное деление на нужное число.

7 div 2 = 3 (3*2 = 6, а остаток от деления 1 и он операцией отбрасывается).

Также есть операция mod - она высчитывает остаток от делений на нужно число.

7 mod 2 = 1