Булева алгебра и логические операции

Что такое Булева Алгебра

Вопрос к аудитории: Как вы принимаете решения в повседневной жизни?

Давайте начнем с логики:

Логика — это наука о правильном рассуждении, и она играет важнейшую роль в нашем повседневном мышлении и, конечно, в программировании. Когда мы пишем программы, мы не просто пишем код; мы создаем систему, которая принимает решения на основе заданных условий.

Представьте, что вы хотите создать программу, которая помогает вам принимать решения:

Пример логического рассуждения - "Если на улице идёт дождь, то я возьму зонт, иначе если нет дождя, пойду гулять в солнечных очках"

Логическое рассуждение

Булева алгебра — это раздел математики, названа в честь Джорджа Булла, работает с двумя основными значениями: истина (true) и ложь (false). Мы можем использовать булеву алгебру для построения логических выражений, которые формируют базу программирования.

Английский математик Джордж Буль
Английский математик Джордж Буль

Логический тип данных

В языке Dart булевый тип данных обозначается как bool

Dart - Булев тип данных
Светлая тема Темная тема

bool isComplete = true;
bool isAdmin = false;

print(isComplete);  // Выведет: true
print(isAdmin); // Выведет: false

Логические операции

В булевой алгебре есть три основные логические операции: И, ИЛИ и НЕ.

Математическая аналогия для логики

Чтобы было легче понять, как работают логические операции, давайте представим, что:

  • true — это число 1 (есть сигнал)
  • false — это число 0 (нет сигнала)

Тогда логические операции можно представить как простые математические действия:

  • И (&&) — это умножение (*). Результат будет 1, только если оба множителя равны 1.
    true && true => 1 * 1 = 1
    true && false => 1 * 0 = 0
  • ИЛИ (||) — это сложение (+), но с одним правилом: 1 + 1 = 1 (в булевой логике). Результат будет 1, если хотя бы одно слагаемое равно 1.
    true || false => 1 + 0 = 1
    false || false => 0 + 0 = 0

Эта аналогия поможет вам быстро вычислять результат сложных логических выражений.

Операция И (&&)

Логическое И

Логическое И возвращает истину, только если оба значения истинны.
Обозначение: &&

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

ABA && B
000
010
100
111

Например: Я пойду гулять, если погода солнечная И сегодня выходной

Dart - Логическое И (&&)
Светлая тема Темная тема

bool isSunny = true;  // Допустим сегодня солнечно
bool isWeekend = false; // Допустим сегодня не выходной

print(isSunny && isWeekend); // false погулять не вышло

// Потому что 
// true && false => false
// 1 * 0 => 0

Операция ИЛИ (||)

Логическое ИЛИ

Логическое ИЛИ возвращает истину, если хотя бы одно из значений истинно.
Обозначение: ||

Это похоже на выбор между двумя альтернативами — если хотя бы одна из них подходит, мы можем считать, что условие выполнено.

ABA || B
000
011
101
111

Например: Я пойду гулять, если сделана домашка ИЛИ сегодня выходные

Dart - Логическое ИЛИ (||)
Светлая тема Темная тема

bool isHomeworkDone = false; // Домашка не сделана
bool isWeekend = true; // Сегодня выходной

print(isHomeworkDone || isWeekend); // true идём гулять, домашка не сделана, но сегодня же выходной

// Потому что 
// false || true => true
// 0 + 1 => 1

Операция НЕ (!)

Логическое НЕ

Логическое НЕ позволяет инвертировать значение (т.е. заменить на противоположное).
Если значение истинно, оно становится ложным, и наоборот.
Обозначение: !

A! A
01
10

Например

Dart - Логическое НЕ (!)
Светлая тема Темная тема

bool isWeekend = true; // Сегодня выходной

print(!isWeekend); // false НЕ выходной

Исключающее ИЛИ (XOR)

Это бинарный оператор, который возвращает true, если булевы операнды имеют разные значения. В противном случае он возвращает false. В Dart для этого используется оператор неравенства !=.

ABA != B
falsefalsefalse
falsetruetrue
truefalsetrue
truetruefalse
Dart - Исключающее ИЛИ (!=)
Светлая тема Темная тема

print(false != false); // false
print(false != true);  // true
print(true != false);  // true
print(true != true);   // false

Комбинирование операций

Сложные логические выражения можно строить, комбинируя &&, || и !.

Приоритет логических операторов в Dart:

  1. ! (наивысший приоритет)
  2. &&
  3. || (наинизший приоритет)

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

Dart - Комбинирование логических операторов
Светлая тема Темная тема

bool isCold = false;    // предположим, сейчас не холодно
bool isDry = true;      // cухо, без дождя
bool isSummer = false;  // предположим, сейчас осень
bool goHiking = isDry && (!isCold || isSummer);

print(goHiking);   // true, можно идти в поход!
Переменная - шаг 1
Переменная - шаг 2
Переменная - шаг 3
Переменная - шаг 4
Переменная - шаг 5
Переменная - шаг 6
Переменная - шаг 7
Переменная - шаг 8
Переменная - шаг 9
Переменная - шаг 10
Переменная - шаг 11

Таблицы истинности используются для анализа и построения логических выражений. Рассмотрим пример выражения ( A && B ) || !C

  1. Сначала посчитаем действие в скобках A && B это будет false && false = false
  2. Далее деланием логическое отрицание !C это будет !false = true
  3. Логическое сложение между этими двумя результатами false || true = true
ABC( A && B ) || !C
0001

Практика

Составьте таблицу истинности для всех значений
Напишите результат для логического выражения
( A && B ) || !C

ABC( A && B ) || !C
000
001
010
011
100
101
110
111

Операторы сравнения

Операторы сравнения возвращают логическое значение (true или false).

ОперацияОбъяснение
==равно
!=не равно
>больше
>=больше или равно
<меньше
<=меньше или равно

Запомните!
Для проверки равенства два знака ==
Один знак = это присваивание

Dart - Операторы сравнения
Светлая тема Темная тема

void main() {
  print(1 == 1); // true
  print(1 < 2);  // true
  print(1 > 2);  // false
  print(1 != 2); // true
  print(3 >= 3); // true
  print(1 <= 2); // true
}

Соединение операций сравнения

Dart - Соединение операций сравнения
Светлая тема Темная тема

  var age = 12;
  print(0 < age && age < 18);
  // true - возраст находится в пределах от 0 до 18 

  var age2 = 20;
  print(0 < age2 && age2 < 18);
  // false - возраст выходит за пределы [0; 18]