Базовые вентили: 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).
- Булева алгебра Буля + идея Шеннона «ток = истина» = фундамент цифровой техники.
- Те же операции доступны программисту как побитовые
& | ~— основа масок и флагов.