Код Грея
Нумерация, в которой соседние числа отличаются одним битом. Формула в одну строку, обращение и где это нужно.
2 мин
Код Грея — такая перестановка чисел от до , что соседние элементы отличаются ровно одним битом. Строится он неожиданно коротко:
При получается .
Почему работает
Соседние и отличаются хвостом вида . После XOR со сдвигом от этого хвоста остаётся ровно один изменившийся бит — тот, что был на границе.
Другой взгляд, рекурсивный: код Грея для битов — это код для бита, потом он же в обратном порядке с добавленной единицей слева. Отсюда видно и то, что все значения различны, и то, что соседи отличаются одним битом, включая границу половин.
Обратное преобразование
unsigned long long inverse(unsigned long long g) {
unsigned long long n = 0;
for (; g; g >>= 1) n ^= g;
return n;
}
Из следует ; раскрывая рекурсию, получаем — это и есть цикл.
Где применяется
Обход всех подмножеств с минимальными изменениями. Если пересчёт при добавлении или удалении одного элемента дешевле, чем счёт с нуля, порядок Грея экономит время.
Ханойские башни. Номер диска, который двигают на -м шаге, равен номеру бита, изменившегося между и .
Физические датчики. На механическом энкодере при переходе между соседними положениями меняется один контакт — значит, промежуточных ложных значений не бывает.