Почему компьютеры знают только 0 и 1
В этой лекции вы поймёте: почему компьютеры выбрали двоичную систему вместо десятичной и как этот выбор определил всю архитектуру современных компьютеров.
Начнём с выключателей
Представьте, что перед вами ряд выключателей освещения.
У каждого переключателя есть только два состояния:разомкнутилизамкнут。
Нельзя сделать переключатель «наполовину разомкнутым» или «разомкнутым на 37%» — он бистабилен и не имеет промежуточного состояния.
Самый базовый компонент внутри компьютера — транзистор — по сути то же самое, что и переключатель.
У него есть только два устойчивых состояния:Проводящее (под напряжением)иОтсечка (обесточено)。
Два состояния напряжения
В цифровых схемах мы присваиваем символ каждому из этих двух состояний:
- Высокое напряжение (например, 3.3V или 5V) представляет1
- Низкое напряжение (близкое к 0V) представляет0
Связь между напряжением и двоичным кодом
Цветовая полоса ниже имитирует диапазон напряжения транзистора от 0V до 3.3V, наглядно показывая связь между логическим 0, логической 1 и запрещённой зоной.
Логический 0 0.5V 1.0V 1.5V
запрещённая зона 1.8V
start 2.1V 2.7V 3.3V
Логическая 1
Диапазон логического 0: 0.0V ~ 1.5V (синяя область) | Запрещённая зона: 1.5V ~ 1.8V (серая область, сигналы не задерживаются) | Диапазон логической 1: 1.8V ~ 3.3V (оранжевая область)
Примечание: схеме не нужно точно измерять значение напряжения; ей достаточно определить «высокий или низкий уровень».
Это намного проще, чем определять «какое это число».
Почему не использовать десятичную систему
Люди используют десятичную систему, потому что у нас десять пальцев.
Но почему компьютеры не могут использовать десятичную систему?
Причина первая: крайне сложно реализовать с инженерной точки зрения
Чтобы схема могла представить 10 цифр десятичной системы (0~9), ей нужно точно различать 10 разных уровней напряжения.
Например: 0V = 0, 0.33V = 1, 0.66V = 2, ..., 3.3V = 9.
Вот в чём проблема: при передаче сигналы подвергаются потерям и помехам.
Предположим, вы отправляете 0.66V, чтобы представить цифру 2, но при прибытии напряжение становится 0.71V.
Принимающая сторона запутается: это 2 (0.66V) или 3 (0.99V)?
Причина вторая: двоичная система естественно помехоустойчива
Двоичной системе нужно различать только два состояния, что даёт огромный запас на ошибку.
Как показано: диапазон логического 0 составляет 0~1.5V, а диапазон логической 1 — 1.8V~3.3V.
В середине находится защитная зона 0.3V.
Даже если сигнал сильно колеблется, пока он не пересекает защищённую зону, данные не будут повреждены.
Причина третья: идеальное соответствие математике
0 и 1 точно соответствуют «ложь» и «истина» в булевой алгебре.
Булева алгебра (логические операции, такие как AND, OR, NOT) имеет полную математическую теорию.
Инженеры могут использовать эту теорию для проектирования, анализа и оптимизации схем — это очень удачное обстоятельство.
То, что компьютеры выбрали двоичную систему, не случайно. Это результат совместного действия инженерных ограничений (простота реализации), физических свойств (помехоустойчивость) и математических инструментов (булева алгебра).
Биты и байты — базовые единицы информации
Двоичная цифра называется 1бит(бит), она может представлять только 0 или 1.
Очевидно, один бит может представить слишком мало информации.
Поэтому мы объединяем 8 бит вместе и называем это 1байт(байт).
Сколько различных значений может представлять байт?
Каждый бит имеет 2 варианта (0 или 1), поэтому число комбинаций 8 бит равно:
2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 = 28 = 256
То есть от 00000000 (десятичное 0) до 11111111 (десятичное 255), всего 256 различных значений.
| количество байт | Диапазон представимых значений | Типичные применения |
|---|---|---|
| 1 байт (8 бит) | 0 ~ 255 | Символ ASCII, значение канала в цвете RGB |
| 2 байта (16 бит) | 0 ~ 65,535 | Номер порта, размер регистра ранних процессоров |
| 4 байта (32 бита) | 0 ~ 4,294,967,295 | IPv4-адреса, тип int |
| 8 байт (64 бита) | 0 ~ прибл. 1.8 x 1019 | Длина слова современных процессоров, тип long |
Интерактивная демонстрация: симулятор лампочки на один байт
Интерактивная панель ниже позволяет интуитивно увидеть, как 8 бит образуют любое значение от 0 до 255.
Каждая лампочка представляет один бит.Нажмите на лампочку, чтобы переключить состояние 0/1, а соответствующее десятичное значение отображается справа в реальном времени.
Симулятор лампочки: один байт = 8 бит
Нажмите на лампочку, чтобы переключить её состояние, и наблюдайте, как двоичное представление соответствует десятичному.
Внимательно посмотрите на метки веса под каждой лампочкой.
Самая левая лампочка имеет наибольший вес (128), а самая правая — наименьший вес (1).
В этом и заключается идея «разложения по весам»: умножьте значение в каждой позиции на её вес и сложите всё вместе, чтобы получить окончательный результат.
Понимание двоичной системы с помощью кода
Python имеет встроенную поддержку двоичной системы, поэтому мы можем напрямую использовать её для проверки демонстрации с лампочками выше.
Пример
# 1. Просмотр двоичного представления числа
print("Десятичное → Двоичное:")
for n in [0, 1, 2, 7, 8, 15, 16, 42, 65, 97, 127, 255]:
# bin() возвращает формат '0b...'; используйте [2:], чтобы убрать префикс.
# zfill(8) дополняет до 8 бит
print(f" {n:3d} → {bin(n)[2:].zfill(8)}")
print()
# 2. Преобразование двоичной строки в десятичное число
print("Двоичное → Десятичное:")
binary_strings = ["00000000", "01000001", "01100001", "11111111"]
for b in binary_strings:
# int(string, 2) преобразует двоичную строку в целое число.
dec = int(b, 2)
print(f" {b} → {dec:3d}")
print()
# 3. Проверка: один байт имеет ровно 256 значений
print("Диапазон байта:")
print(fМинимальное значение: {int('00000000', 2)})
print(fМаксимальное значение: {int('11111111', 2)})
print(fОбщее количество: {int('11111111', 2) - int('00000000', 2) + 1})
print()
# 4. Побитовые операции: И, ИЛИ, сдвиг влево, сдвиг вправо
print("Пример побитовой операции:")
a = 0b0011 # 3
b = 0b0101 # 5
print(f{bin(a)} & {bin(b)} = {bin(a & b)} (побитовое И))
print(f{bin(a)} | {bin(b)} = {bin(a | b)} (побитовое ИЛИ))
print(f{bin(a)} << 1 = {bin(a << 1)} (сдвиг влево на 1 бит, эквивалентно умножению на 2))
print(f{bin(b)} >> 1 = {bin(b >> 1)} (сдвиг вправо на 1 бит, эквивалентно делению на 2))
print()
# 5. ПРИМЕР тестовой строки
text = "EXAMPLE"
print(fДвоичное представление каждого символа в строке '{text}':)
for ch in text:
ascii_val = ord(ch)
print(f" '{ch}' → ASCII={ascii_val:3d} → двоичное={bin(ascii_val)[2:].zfill(8)}")
Почему двоичная система лежит в основе "представления информации"
Поняв двоичную систему, вы поймёте ключевой факт:
Всё внутри компьютера — числа, текст, изображения, звук, видео — в конечном итоге хранится и обрабатывается в виде 0 и 1.
В следующих лекциях вы увидите:
- Лекция 2: Как переводить числа между разными системами счисления
- Лекция 3: как отрицательные числа представляются в двоичном виде (дополнительный код)
- Лекция 4: как десятичные дроби представляются в двоичном виде (с плавающей запятой)
- Лекция 5: как текст представляется в двоичном виде (кодировка символов)
Все они построены на основе того, что "всё состоит из 0 и 1."
Другие расширенияГлавный вывод всех 5 лекций этого модуля: компьютеры не "понимают" информацию; вместо этого с помощью изобретательных правил кодирования они отображают всё в мире в комбинации 0 и 1.