Базовый CS с нуля
Счёт в двоичной системе
Ты уже знаешь, что бит — это одиночный переключатель с двумя состояниями: он хранит 0 или 1. Но один переключатель может ответить только на один вопрос «да/нет». Как тогда строка из восьми переключателей кодирует число 42, или 200, или 255? Ответ — тот же приём, что использует твой калькулятор, ни разу тебе об этом не сообщив: позиционная запись. Тот же принцип, по которому цифра 3 стоит тридцать в «32» и триста в «307», работает в двоичной системе — только каждый разряд стоит не в десять, а ровно в два раза больше предыдущего.
После этого урока ты сможешь прочитать двоичное число, суммируя его позиционные веса, перевести любое небольшое десятичное число в двоичное делением на 2, и объяснить, почему добавление одного бита всегда удваивает количество чисел, которые можно закодировать.
Позиционная запись: та же идея, что в десятичной системе, но с основанием 2 вместо 10. В десятичной системе, которую ты уже знаешь, каждый разряд имеет вес, равный степени десяти: разряд единиц — 10⁰ = 1, разряд десятков — 10¹ = 10, разряд сотен — 10² = 100, и так далее. Число — это просто сумма каждой цифры, умноженной на её весовой коэффициент. В двоичной системе единственное отличие: основание равно 2 вместо 10, поэтому весá — степени двойки: 2⁰ = 1, 2¹ = 2, 2² = 4, 2³ = 8, 2⁴ = 16 и так далее. Каждая двоичная цифра (0 или 1) умножается на свой весовой коэффициент, и результаты складываются.
Почему каждый разряд стоит вдвое больше соседнего справа. Подумай о том, что означает «перенос». Когда счёт доходит до предела текущего разряда, происходит перенос в следующий. В десятичной системе предел — 9; в двоичной предел — 1: следующее после 1 значение переполняется и переносится. Именно этот вынужденный перенос объясняет, почему следующий разряд стоит 2: он представляет одно переполнение разряда ниже. Глубже: каждый добавленный в двоичное число разряд удваивает количество возможных паттернов. Один бит даёт 2 паттерна (0 и 1). Два бита дают 4 (00, 01, 10, 11). Три бита — 8. Каждый дополнительный бит умножает на 2, поэтому каждый разряд стоит ровно вдвое больше предыдущего.
Чтение двоичного числа: умножь каждую 1 на её вес и суммируй. Для 8-битного паттерна
0 1 0 1 1 0 1 0 назначь веса справа налево — 1, 2, 4, 8, 16, 32, 64, 128. Только
позиции, содержащие 1, вносят вклад: сложи их веса, а позиции с 0 игнорируй. Сумма —
это десятичное значение двоичного числа.
Запись двоичного числа: переводи десятичное в двоичное последовательным делением на 2. Чтобы узнать, какие биты включены для данного десятичного числа, делим его на 2 последовательно и записываем каждый остаток. Остатки, прочитанные с последнего к первому, дают двоичное число. Это работает потому, что деление на 2 «снимает» наименее значимый бит как остаток: нечётные числа имеют 1 на позиции единиц (остаток 1 при делении на 2), чётные — 0 (остаток 0). Каждое деление сдвигает значение на один битовый разряд вправо, поэтому повторение извлекает все биты от наименее значимого к наиболее значимому.
Почему это работает
Почему остатки получаются в обратном порядке? Первое деление даёт тебе бит с весом 1 (самый правый), потому что именно этот бит определяет, нечётное число или чётное. Второе деление даёт бит с весом 2, и так далее. Поскольку мы собираем биты начиная с наименее значимого, в конце нужно перевернуть список, чтобы получить обычную запись двоичного числа слева направо.
Перевод числа 13 в двоичное и обратно.
Десятичное → двоичное (последовательное деление):
| Деление | Частное | Остаток |
|---|---|---|
| 13 ÷ 2 | 6 | 1 |
| 6 ÷ 2 | 3 | 0 |
| 3 ÷ 2 | 1 | 1 |
| 1 ÷ 2 | 0 | 1 |
Остатки снизу вверх: 1, 1, 0, 1 → двоичное 1101.
Двоичное → десятичное (сумма весов):
1101 — назначаем веса справа налево: 1, 2, 4, 8.
| Бит | Вес | Вклад |
|---|---|---|
| 1 | 1 | 1 |
| 0 | 2 | 0 |
| 1 | 4 | 4 |
| 1 | 8 | 8 |
Сумма: 8 + 4 + 0 + 1 = 13. Вернулись к исходному числу.
Частая ошибка
Частая ошибка — читать двоичное число слева направо, не назначая весов. Крайний левый бит имеет не вес 1 — он имеет наибольший вес в паттерне. В 8-битном числе крайний левый бит имеет вес 128. Всегда привязывай позицию с весом 1 к правому концу, а затем удваивай влево: 1, 2, 4, 8, 16, 32, 64, 128.
Чему равно десятичное значение 4-битного двоичного числа 1010? (Веса разрядов: 8, 4, 2, 1.) Введи число.
Чему равно десятичное значение двоичного числа 1111 (4 бита)? Введи число.
Переведи десятичное число 6 в 4-битное двоичное. Проверь: чему равно десятичное значение 0110?
Сколько различных значений может представить 4-битное двоичное число? (Посчитай от 0000 до 1111 включительно.) Введи количество.
Чему равно десятичное значение двоичного числа 10000000 (8 битов)? Введи число.
Почему добавление одного бита к двоичному паттерну ровно удваивает количество значений, которые этот паттерн может представить?
Двоичные числа используют позиционную запись — ровно как десятичные, но со степенями двойки вместо степеней десяти. Крайний правый бит имеет вес 1, следующий — 2, затем 4, 8, 16 — каждый разряд вдвое больше соседнего справа. Чтобы прочитать двоичное число, суммируй веса всех позиций с 1. Чтобы записать двоичное число, последовательно дели десятичное на 2 и читай остатки с последнего к первому. Добавление одного бита удваивает количество представимых значений, потому что каждый существующий паттерн получает двойника с новым битом, равным 1.