Вывод n-го кода Грея из (n-1) -го кода Грея

Есть ли способ получить 4-битный n-й код Грея, используя (n-1) -й код Грея, используя битовые операции с (n-1) -ым кодом Грея?

Например, 4-й код Грея - 0010. Теперь я хочу получить 5-й код Грея, 0110, выполняя битовые операции на 0010.

2 ответа

Решение

Возможно, это "обман", но вы можете просто упаковать таблицу поиска в 64-битное постоянное значение, например так:

0000 0 -> 1
0001 1 -> 3
0011 3 -> 2
0010 2 -> 6
0110 6 -> 7
0111 7 -> 5
0101 5 -> 4
0100 4 -> C
1100 C -> D
1101 D -> F
1111 F -> E
1110 E -> A
1010 A -> B
1011 B -> 9
1001 9 -> 8
1000 8 -> 0

FEDCBA9876543210 nybble order (current Gray code)
|              |
V              V
EAFD9B80574C2631 next Gray code

Затем вы можете использовать смены и маски для выполнения поиска (в зависимости от вашего языка):

int next_gray_code(int code)
{
     return (0xEAFD9B80574C2631ULL >> (code << 2)) & 15;
}

В качестве альтернативы, вы можете использовать формулу для преобразования Грея в двоичное, увеличить значение, а затем преобразовать двоичное значение в Греческое, которое равно n xor (n / 2):

int next_gray_code(int code)
{
    code = code ^ (code >> 2);
    code = code ^ (code >> 1);
    code = (code + 1) & 15;
    return code ^ (code >> 1);
}

Как насчет следующего?

t1 := XOR(g0, g1)
b0 := !XOR(g0, g1, g2, g3)
b1 := t1 & g2 & g3 + !t1 & !g2 & !g3
b2 := t1 & g2 & !g3
b3 := t1 & !g2 & !g3

n0 := XOR(b0, g0)
n1 := XOR(b1, g1)
n2 := XOR(b2, g2)
n3 := XOR(b3, g3)

Текущее серое кодовое слово g3 g2 g1 g0 и следующее кодовое слово n3 n2 n1 n0, b3 b2 b1 b0 четыре бита, которые переворачивают или не переворачивают бит в кодовом слове, чтобы перейти к следующему кодовому слову. Только один бит изменяется между соседними кодовыми словами.

Другие вопросы по тегам