Код Грея назван «рефлексивным» (отражённым) из-за того, что первая половина значений при изменении порядка эквивалентна второй половине, за исключением старшего бита. Старший бит просто инвертируется. При делении каждой новой половины пополам это свойство сохраняется (см. самоподобие ).
Код назван в честь исследователя Фрэнка Грея, работавшего в лаборатории «Bell labs ». Грей запатентовал (патент № 2632058) и впервые использовал этот код в своей импульсной системе связи.
Код Гре́я — двоичный код , иначе зеркальный код, он же код с отражением, в котором две «соседние» (в упорядоченном, то есть лексикографическом, наборе ) кодовые комбинации различаются только цифрой в одном двоичном разряде. Иными словами, расстояние Хэмминга между соседними кодовыми комбинациями равно 1.
Наиболее часто на практике применяется рефлексивный двоичный код Грея , хотя в общем случае существует бесконечное множество кодов Грея со значениями цифр в разрядах, взятых из различных алфавитов. В большинстве случаев, под термином «код Грея» понимают именно рефлексивный бинарный код Грея.
Изначально предназначался для защиты от ложного срабатывания электромеханических переключателей. Сегодня коды Грея широко используются для упрощения выявления и исправления ошибок в системах связи, а также в формировании сигналов обратной связи в системах управления.
Преобразование двоичного кода в код Грея
Коды Грея легко получаются из двоичных чисел путём побитовой операции «Исключающее ИЛИ » с тем же числом, сдвинутым вправо на один бит и в котором старший разряд заполняется нулём. Следовательно, i -й бит кода Грея Gi выражается через биты двоичного кода Bi
Преобразование кода Грея в двоичный код
Обратный алгоритм — преобразование кода Грея в двоичный код.
Загружено с
Загружено с Действительно,iДействительно,i
Ниже приведена функция на языке С, реализующая данный алгоритм. Она осуществляет последовательный сдвиг вправо и суммирование исходного двоичного числа, до тех пор, пока очередной сдвиг не обнулит слагаемое.
unsigned int graydecode(unsigned int gray)
{
unsigned int bin;
for (bin = 0; gray; gray >>= 1) {
bin ^= gray;
}
return bin;
}
Тот же самый алгоритм, записанный на языке Паскаль:
function GrayToBin(b: integer): integer;
var g: integer;
begin
g := 0;
while b > 0 do begin
g := g xor b;
b := b shr 1;
end;
GrayToBin := g;
end;
Пример: преобразовать код Грея 11101 в двоичный код.
11101
01110
00111
00011
00001
-----
10110
Быстрое преобразование 8/16/24/32-разрядного значения кода Грея в двоичный код на языке C (Примечание: исходный код Грея является составным. Где каждая тетрада бит является отдельным числом и закодирована отдельно. Этот код не является полноценным кодом Грея. И правило изменения одного бита при переходе к новому числу сохраняется только в пределах каждой четвёрки. Например при переходе от 0x0F к 0x10 изменяются одновременно два бита так как мы имеем изменение двух тетрад 0->1 и F->0):
int gray2bin(int x)
{
return x ^ ((x & 0x88888888) >> 3) ^ ((x & 0xCCCCCCCC) >> 2) ^ ((x & 0xEEEEEEEE) >> 1);
}
Простой способ преобразования двоичного числа в код Грея выполняется по правилу: старший разряд записывается без изменения, каждый следующий символ кода Грея нужно инвертировать, если в натуральном коде перед этим была получена «1», и оставить без изменения, если в натуральном коде был получен «0».
Сбалансированный код Грея
Если датчики имеют ограниченный ресурс по количеству переключений, хотелось бы, чтобы они изнашивались равномерно. В сбалансированном коде Грея в разных разрядах количество переключений настолько близко, насколько можно.
Код Грея является одной из важнейших структур сервоинформации, размещаемой на диске, с целью обеспечения точности позиционирования головок чтения/записи. Код Грея , чаще всего, используется для адресации цилиндров дискового массива.