Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ТЭИС.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
11.22 Mб
Скачать

2.3.3.Код Грэя

Другой пример последовательности двоичных кодовых слов это код Грэя (последовательность кодовых слов в порядке минимального изменения). Код Грэя обладает ценным свойством, заключающемся в том, что любые два соседних кодовых слова отличаются лишь значением в одном разряде. Код Грэя используется при построении различных преобразователей аналог-код, где он позволяет свести к единице младшего разряда ошибку неоднозначности при считывании информации.

Рекурсивное определение двоично-отраженного кода Грея следующее:

Примеры последовательностей двоичных наборов в порядке двоичного счета и порядке минимального изменения представлены в таблице 2.1.

Таблица 2.1

Последовательности двоичных наборов в порядке двоичного счета и порядке минимального изменения

Последовательности двоичных наборов в порядке двоичного счета

Последовательности двоичных наборов в порядке минимального изменения (коды Грэя)

G(1)

G(2)

G(3)

G(1)

G(2)

G(3)

0

00

000

0

00

000

1

01

001

1

01

001

10

010

11

011

11

011

10

010

100

110

101

111

110

101

111

100

Рассмотрим алгоритм порождения кода Грэя. Коды Грея удобно задавать начальным словом и последовательностью переходов, т.е. упорядоченным списком номеров разрядов (пронумерованных справа налево, нумерация с единицы), которые меняются при переходе от одного кодового слова к другому. Так для приведенного в таблице 2.1 кода G(3) начальное слово (000), а последовательность переходов будет иметь вид Т3=1,2,1,3,1,2,1.

Пусть есть последовательность переходов для n-разрядного кода, тогда можно дать рекурсивное определение последовательности переходов.

1) Т1=1,

2) Tn+1=Tn,n+1, .

Следует отметить, что последовательности переходов Tn и одинаковы. Поэтому данное рекурсивное определение упрощается:

1) T1=1,

2) Tn+1=Tn,n+1,Tn.

Итак, для порождения кода Грея достаточно уметь порождать последовательность его переходов.

Последовательность переходов можно порождать итеративно, используя стек. Вначале стек содержит элементы n,n-1,...,1 1 в вершине). Затем верхний элемент стекаi выталкивается и помещается в последовательность переходов, после этого в стек добавляются элементы i-1,i-2,...,1. Процесс повторяется пока стек не пуст. Алгоритм порождения кода Грея представлен укрупненной блок-схемой на рис.2.5.

В укрупненной блок схеме не детализировано, как осуществлять операции работы со стеком. Далее различные способы реализации стека будут рассмотрены более подробно. Пока же для организации стека S можно использовать массив и переменную t, следящую за вершиной стека. Пусть для S отведены ячейки S[1], S[2],...,S[m], и число элементов в стеке не превышает m, тогда пустой стек соответствует случаю t=0. Операция занесения в стек некоторого значения x и извлечения из стека будут осуществляться следующим образом:

  • занесение x в стек S: t=t+1; S[t]=x;

  • извлечение x из стека S: x:=S[t]; t:=t-1.

Также в укрупненной блок-схеме не детализировано, как выполнять инвертирование элемента q[i]. Заметим, что элемент имеет целочисленный тип, поэтому выполнение операции q[i]:=not q[i] не приведет к желаемому результату (объясните почему). Можно было реализовать операцию инвертирования, например следующим образом: q[i]:=q[i] xor 1 или q[i]:=not q[i] and 1 (объясните почему), но в данном случае лучше заменить инвертирование арифметическими операциями: q[i]:=1-q[i].

Программа, реализующая алгоритм генерации кода Грея и использующая рассмотренный способ реализации стека и инвертирования представлена в листинге 2.3.

Листинг 2.3

const n_max=50; {максимальная длина кодового слова}

var q,S:array[1..n_max] of byte;

i,j,t:byte;

begin

write(‘Введиде длину кодового слова n=’); readln(n);

t:=0; {S - пустой стек}

for j:=n downto 1 do

begin

q[j]:=0;

t:=t+1; S[t]:=j {Занести в стек S значение j}

end;

while t<>0 do

begin

for j:=n downto 1 do write(q[j]); writeln;

i:=S[t]; t:=t-1; {Извлечь из стека S значение i}

q[i]:=1-q[i]; {Проинвертировать элемент q[i]}

for j:=i-1 downto 1 do

begin

t:=t+1; S[t]:=j {Занести в стек S значение j}

end;

end;

for j:=n downto 1 do write(q[j]); writeln;

end;