Почему компьютеры знают только 0 и 1

В этой лекции вы поймёте: почему компьютеры выбрали двоичную систему вместо десятичной и как этот выбор определил всю архитектуру современных компьютеров.


Начнём с выключателей

Представьте, что перед вами ряд выключателей освещения.

У каждого переключателя есть только два состояния:разомкнутилизамкнут。

Нельзя сделать переключатель «наполовину разомкнутым» или «разомкнутым на 37%» — он бистабилен и не имеет промежуточного состояния.

Самый базовый компонент внутри компьютера — транзистор — по сути то же самое, что и переключатель.

У него есть только два устойчивых состояния:Проводящее (под напряжением)иОтсечка (обесточено)。

Два состояния напряжения

В цифровых схемах мы присваиваем символ каждому из этих двух состояний:

  • Высокое напряжение (например, 3.3V или 5V) представляет1
  • Низкое напряжение (близкое к 0V) представляет0

Связь между напряжением и двоичным кодом

Цветовая полоса ниже имитирует диапазон напряжения транзистора от 0V до 3.3V, наглядно показывая связь между логическим 0, логической 1 и запрещённой зоной.

0.0V
Логический 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,295IPv4-адреса, тип int
8 байт (64 бита)0 ~ прибл. 1.8 x 1019Длина слова современных процессоров, тип long

Интерактивная демонстрация: симулятор лампочки на один байт

Интерактивная панель ниже позволяет интуитивно увидеть, как 8 бит образуют любое значение от 0 до 255.

Каждая лампочка представляет один бит.Нажмите на лампочку, чтобы переключить состояние 0/1, а соответствующее десятичное значение отображается справа в реальном времени.

Симулятор лампочки: один байт = 8 бит

Нажмите на лампочку, чтобы переключить её состояние, и наблюдайте, как двоичное представление соответствует десятичному.

Десятичное:0
Двоичная система:00000000

Внимательно посмотрите на метки веса под каждой лампочкой.

Самая левая лампочка имеет наибольший вес (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.

Другие расширения