Базовые вентили: AND, OR, NOT

Урок вводит три базовых логических вентиля, из которых складывается вся цифровая логика.

Логический вентиль — элементарная схема, вычисляющая булеву функцию: на входах биты (0/1), на выходе один бит по строгому правилу.

Зачем булева алгебра

В середине XIX века Джордж Буль придумал алгебру логики с двумя значениями: «истина» и «ложь». Спустя почти столетие Клод Шеннон заметил: эти значения идеально ложатся на «есть ток / нет тока». Так булева алгебра стала математическим фундаментом всей цифровой техники. Любая операция процессора — в конечном счёте комбинация трёх базовых вентилей.

Три кита

NOT (инверсия) — один вход, переворачивает бит. AND (И) — выход 1, только если все входы 1. OR (ИЛИ) — выход 1, если хотя бы один вход 1. Таблицы истинности:

   NOT          AND               OR
  a | y      a b | y           a b | y
 ---+---    -----+---         -----+---
  0 | 1      0 0 | 0           0 0 | 0
  1 | 0      0 1 | 0           0 1 | 1
             1 0 | 0           1 0 | 1
             1 1 | 1           1 1 | 1

Запомнить легко: AND — как умножение (1·1=1, иначе 0), OR — как «хотя бы один». Принятые обозначения на схемах: NOT — треугольник с кружком, AND — «D»-образный, OR — со щитом. В формулах: NOT a записывают как ¬a или a', AND — как a·b или a∧b, OR — как a+b или a∨b.

Как работает под капотом

Реализуем вентили на Python и распечатаем их таблицы истинности — ровно так, как их проектируют инженеры:

def NOT(a): return 1 - a
def AND(a, b): return a & b
def OR(a, b):  return a | b

print("a b | NOT a | AND | OR")
print("----+-------+-----+----")
for a in (0, 1):
    for b in (0, 1):
        print(f"{a} {b} |   {NOT(a)}   |  {AND(a,b)}  | {OR(a,b)}")

Вывод:

a b | NOT a | AND | OR
----+-------+-----+----
0 0 |   1   |  0  | 0
0 1 |   1   |  0  | 1
1 0 |   0   |  0  | 1
1 1 |   0   |  1  | 1

Зачем это программисту прямо сейчас

Те же операции работают побитово над целыми числами в любом языке. & — это AND, | — OR, ~ — NOT. Маски, флаги, права доступа — всё на них:

READ, WRITE, EXEC = 0b100, 0b010, 0b001
perms = READ | WRITE              # выдаём чтение и запись
print("права:", format(perms, '03b'))
print("есть запись?", bool(perms & WRITE))
print("есть исполнение?", bool(perms & EXEC))
perms = perms & ~WRITE            # снимаем запись маской
print("после снятия записи:", format(perms, '03b'))

Вывод:

права: 110
есть запись? True
есть исполнение? False
после снятия записи: 100

Историческая справка: как логика стала железом

Стоит оценить, насколько неочевидным был мост между чистой математикой и инженерией. Джордж Буль в 1854 году создавал свою алгебру логики как философ, исследующий «законы мышления», — никаких компьютеров тогда не существовало даже в проекте. Его две величины, «истина» и «ложь», и операции над ними были абстракцией без всякого практического приложения почти восемьдесят лет. Поворот совершил двадцатидвухлетний Клод Шеннон: в магистерской диссертации 1937 года (её называют одной из самых влиятельных в истории) он заметил, что переключательные релейные схемы — где контакт либо замкнут, либо разомкнут — подчиняются ровно тем же законам, что булева алгебра Буля. «Замкнуто = истина, разомкнуто = ложь» — и вся накопленная математика логики разом стала инструментом проектирования схем.

Без этого озарения проектирование вычислительных машин осталось бы кустарным перебором проводов. С ним — стало строгой инженерной дисциплиной: схему можно записать формулой, упростить алгеброй и доказать корректной. Каждый раз, набирая a & b в коде, вы используете мост, перекинутый Шенноном между викторианской философией и кремнием.

Глубже: одни и те же вентили в природе и в коде

Удивительно, как далеко простирается власть трёх базовых операций. Условие if temperature > 30 and humidity > 70 в коде термостата — это вентиль AND. Проверка if is_admin or is_owner для доступа — это OR. Любое логическое условие в любой программе мира в конечном счёте раскладывается на комбинации AND, OR, NOT, потому что булева алгебра функционально полна уже на этой тройке. Более того, эти же операции лежат в основе поисковых запросов («кошки AND NOT собаки»), реляционных баз данных (условия WHERE), цифровых фильтров и систем принятия решений.

Эта универсальность не совпадение, а теорема: доказано, что любую функцию, отображающую наборы битов в биты, можно выразить через AND, OR и NOT. Поэтому процессор, умеющий лишь эти операции (плюс память), — это уже полноценный вычислитель. Когда вы понимаете три вентиля, вы держите в руках кирпич, из которого сложена вся цифровая логика — от калькулятора до нейросети.

Зачем это программисту: маски флагов крупным планом

Побитовые операции из примера с правами доступа — это не экзотика, а основной приём упаковки множества «да/нет» в одно число. Вместо десяти отдельных булевых переменных (десять байт памяти и десять полей) можно завести одно целое, где каждый бит — отдельный флаг, и проверять их масками: flags & FLAG отвечает «включён ли флаг», flags | FLAG включает его, flags & ~FLAG выключает. Так устроены права в файловых системах Unix, наборы настроек в графических API, регистры состояния самого процессора, где каждый бит — отдельный сигнал (перенос, ноль, переполнение). Понимание AND/OR/NOT на уровне отдельных бит превращает работу с флагами из загадочной магии & и | в очевидную и предсказуемую технику.

Частые ошибки

  • Путать логическое и побитовое. В Python and/or работают с истинностью всего значения, а &/| — с каждым битом отдельно.
  • Думать, что OR — это «исключающее или». Обычное OR даёт 1 и при двух единицах; «либо то, либо это» — это XOR (следующий урок).
  • Забывать про приоритет. a & b == 0 часто значит не то, что кажется: сравнение сильнее &.

Итог

  • Три базовых вентиля: NOT (инверсия), AND (все входы 1), OR (хотя бы один 1).
  • Булева алгебра Буля + идея Шеннона «ток = истина» = фундамент цифровой техники.
  • Те же операции доступны программисту как побитовые & | ~ — основа масок и флагов.
Проверьте себя
1. Когда вентиль AND даёт на выходе 1?
AКогда хотя бы один вход равен 1
BТолько когда все входы равны 1
CКогда входы различны
DВсегда, кроме случая всех нулей
2. Какой оператор Python выполняет побитовое OR?
Aor
B||
C|
D+
3. Кто связал булеву алгебру с электрическими цепями?
AДжордж Буль
BКлод Шеннон
CАлан Тьюринг
DДжон фон Нейман