Без использования внешних счетчиков или другого состояния я ищу эффективную функцию, которая принимает n-битное значение (32 бит или около того) и возвращает последующее значение в Серый код.
То есть:
int fn(int x)
{
int y = gray_to_binary(x);
y = y + 1;
return binary_to_gray(y);
}
Но в то время как функция binary_to_gray()
тривиальна (x ^ (x >> 1)
), соответствующий gray_to_binary()
не является вообще тривиальным (цикл из log(n)
итераций).
Возможно, существует более эффективная последовательность операций? Либо для стандартного отраженного кода Grey, либо для другого кода Grey, выбранного для решения этой проблемы.
Помимо этого: Я вижу два возможных типа решения этой проблемы: нужно выбрать код, который проще преобразовать в двоичный код и использовать приведенную выше форму (или продемонстрировать более эффективную преобразование в двоичный код для отраженных кодов), а другое - отложить преобразование в двоичное целое и создать метод, проходящий через серый код без использования двоичного приращения.
В последнем случае может оказаться особенно трудным преобразовать полученный код в двоичный. Вероятно, это практический подход, но все же было бы интересно посмотреть.
Обновление:. Поскольку было указано, что декодирование серого - это всего лишь операции log(n)
(используя любой из двух разных методов), я потратил некоторое время, пытаясь выяснить, является ли это строгим лимитом о том, как далеко можно упростить вещи. Все биты должны учитываться при определении следующей операции для выполнения, иначе "рассмотренные" биты не будут меняться, и функция будет колебаться между двумя значениями. Вход должен быть каким-то образом сжат до управляемой шкалы, чтобы определить следующую операцию для выполнения.
Для выполнения операций log(n-k)
для сокращения последних операций k
можно использовать 2 k -entry LUT (комментарий предлагает k=32
).
Другая техника, которая приходила на ум, которая часто может очень быстро сокращать вещи, - это комбинация умножения и битмаски. Например, чтобы вычислить parity, чтобы реализовать алгоритм, основанный на четности.
Из подхода с множественной и битовой маской кажется, что может возникнуть необходимость изобретать серый код, который еще больше упрощает набор операций... но я не думаю, что такой код известен.