Рефлексный двоичный код¶
Рефлексный двоичный код (также известный как код Грея, отражённый двоичный код, двоичный код с отражением) — это позиционная система счисления, в которой два соседних значения отличаются состоянием только одного разряда (бита). В отличие от обычного двоичного кода, где при переходе между числами может изменяться сразу несколько битов, рефлексный код гарантирует, что расстояние Хэмминга между любыми двумя последовательными числами равно единице. Это свойство делает его незаменимым в системах, чувствительных к ошибкам переключения, таких как цифровые энкодеры, телекоммуникация и теория кодирования.
¶История
Рефлексный двоичный код был впервые описан американским физиком и инженером Фрэнком Греем (Frank Gray) в 1947 году в контексте импульсно-кодовой модуляции (PCM) для уменьшения ошибок при передаче сигналов. Однако сам принцип «отражения» битов был известен ранее: в 1878 году французский инженер Эмиль Бодо (Émile Baudot) использовал подобный код для телеграфной передачи, а в 1940-х годах советский математик А. А. Ляпунов также исследовал свойства кодов с минимальным изменением. Грей получил патент США № 2 632 058 в 1953 году, где код был назван «reflected binary code» (отражённый двоичный код) из-за способа его построения путём отражения предыдущих значений.
¶Принцип построения
Рефлексный код строится рекурсивно. Для одного бита (n=1) последовательность имеет вид: 0, 1. Для n битов код получается следующим образом:
- Записывается последовательность для n-1 битов.
- К ней добавляется её зеркальное отражение (в обратном порядке).
- К первой половине добавляется ведущий ноль, ко второй — ведущая единица.
Например, для n=2:
- Исходная последовательность для 1 бита: 0, 1.
- Отражение: 1, 0.
- Объединение: 0, 1, 1, 0.
- Добавление ведущих битов: 00, 01, 11, 10.
Для n=3:
- Последовательность для 2 битов: 00, 01, 11, 10.
- Отражение: 10, 11, 01, 00.
- Объединение: 00, 01, 11, 10, 10, 11, 01, 00.
- Добавление ведущих битов: 000, 001, 011, 010, 110, 111, 101, 100.
Таким образом, код называется «рефлексным» из-за зеркального отражения старших битов. Этот метод гарантирует, что при переходе от любого числа к следующему изменяется только один бит, а также что код является циклическим (последнее и первое значения также отличаются одним битом, если последовательность замкнута в кольцо).
¶Свойства
¶Единичное расстояние Хэмминга
Основное свойство: соседние кодовые слова отличаются ровно одним битом. Это минимизирует вероятность ошибки при считывании данных, особенно в механических системах, где несколько битов могут изменяться несинхронно.
¶Цикличность
Рефлексный код является циклическим: первое и последнее значения (для n битов — 0 и 2^n-1) также отличаются одним битом. Например, для n=3: 000 и 100 отличаются только старшим битом.
¶Симметрия
Код симметричен относительно середины последовательности: вторая половина является зеркальным отражением первой с инвертированным старшим битом.
¶Отсутствие веса
В отличие от двоично-десятичного или обычного двоичного кода, биты в рефлексном коде не имеют фиксированного веса (значения степеней двойки). Это означает, что арифметические операции (сложение, умножение) в этом коде неэффективны, и для вычислений его обычно преобразуют в обычный двоичный код.
¶Преобразование между двоичным и рефлексным кодом
¶Из двоичного в рефлексный
Для преобразования двоичного числа B (с битами b_n-1, b_n-2, ..., b_0) в рефлексный код G (с битами g_n-1, g_n-2, ..., g_0) используется операция XOR (исключающее ИЛИ):
- Старший бит: g_n-1 = b_n-1.
- Для остальных битов: g_i = b_i XOR b_{i+1}, где i от n-2 до 0.
Пример: двоичное 1010 (10 в десятичной) → g_3 = 1, g_2 = 1 XOR 0 = 1, g_1 = 0 XOR 1 = 1, g_0 = 1 XOR 0 = 1 → рефлексный код 1111.
¶Из рефлексного в двоичный
Обратное преобразование:
- Старший бит: b_n-1 = g_n-1.
- Для остальных битов: b_i = g_i XOR b_{i+1}, где i от n-2 до 0. То есть двоичный код получается последовательным XOR всех предыдущих битов рефлексного кода.
Пример: рефлексный 1111 → b_3 = 1, b_2 = 1 XOR 1 = 0, b_1 = 1 XOR 0 = 1, b_0 = 1 XOR 1 = 0 → двоичный 1010.
¶Применение
¶Промышленные энкодеры
Рефлексный код широко используется в оптических и магнитных энкодерах (датчиках угла поворота или линейного перемещения). В таких устройствах считывание положения происходит по дорожкам с нанесёнными кодовыми метками. Если бы использовался обычный двоичный код, то при переходе между соседними позициями (например, от 0111 к 1000) могли бы измениться все биты одновременно, и из-за механических допусков или несинхронности считывания возможна ошибка (например, считывание 1111). Рефлексный код гарантирует, что изменяется только один бит, что исключает грубые ошибки.
¶Телекоммуникация и передача данных
В цифровой связи рефлексный код применяется для уменьшения вероятности ошибок при передаче сигналов, особенно в системах с импульсно-кодовой модуляцией (PCM). Например, в стандарте G.711 для кодирования голоса используется μ-law и A-law компандирование, которые основаны на рефлексном коде для минимизации искажений.
¶Теория кодирования
Код Грея используется в алгоритмах для решения задачи о гамильтоновом пути на гиперкубе, в генетических алгоритмах (для кодирования хромосом), а также в цифровой обработке сигналов (например, в быстром преобразовании Фурье).
¶Компьютерная графика и картография
В некоторых алгоритмах сжатия изображений и при построении карт высот (террейнов) рефлексный код применяется для упорядочивания пикселей или вершин, чтобы минимизировать изменения при последовательном чтении.
¶Квантовые вычисления
В квантовых алгоритмах, таких как алгоритм Гровера или квантовое преобразование Фурье, рефлексный код используется для построения последовательностей операций, минимизирующих количество переключений кубитов.
¶Разновидности
Существуют обобщения рефлексного кода:
- n-арный рефлексный код — для систем счисления с основанием больше 2 (например, троичный код Грея).
- Взвешенный рефлексный код — модификация, в которой биты имеют веса, но сохраняется свойство единичного изменения.
- Циклический рефлексный код — код, замкнутый в кольцо, где последнее и первое значения также отличаются одним битом.
- Двоично-десятичный код Грея — используется в цифровых вольтметрах и других измерительных приборах, где требуется отображение десятичных цифр.
¶Интересные факты
- Рефлексный код часто называют «кодом Грея» в честь Фрэнка Грея, хотя сам Грей в патенте использовал термин «reflected binary code».
- В некоторых областях, например в робототехнике, код Грея применяется для кодирования углов поворота сервоприводов, чтобы избежать рывков при считывании.
- В математике рефлексный код связан с последовательностью Грея, которая является гамильтоновым путём на n-мерном гиперкубе.
- В СССР рефлексный код активно использовался в вычислительной технике, например в ЭВМ «Минск-32» и «Эльбрус», для кодирования адресов памяти.
¶Критика и ограничения
Основной недостаток рефлексного кода — невозможность выполнения арифметических операций без предварительного преобразования в обычный двоичный код. Это увеличивает задержки и сложность схем в цифровых системах. Кроме того, для больших разрядностей (более 16 бит) преобразование может требовать значительных вычислительных ресурсов, хотя существуют быстрые алгоритмы (например, на основе таблиц перекодировки). В некоторых приложениях, где требуется высокая скорость обработки, предпочитают использовать другие коды с единичным расстоянием, такие как код Джонсона или код с избыточностью.
¶Источники
- Frank Gray. Pulse Code Communication. U.S. Patent 2 632 058, 1953.
- А. А. Ляпунов. О некоторых свойствах кодов с отражением. Труды Математического института АН СССР, 1948.
- W. H. Press, S. A. Teukolsky, W. T. Vetterling, B. P. Flannery. Numerical Recipes in C. Cambridge University Press, 1992 (глава о кодах Грея).
- ГОСТ 27464-87 «Системы обработки информации. Коды двоичные с отражением».
- Энциклопедия кибернетики. Киев, 1975 (статья «Код Грея»).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


