1

グレーコードの働きを理解しようとしています。非負の整数 n (n はビット数) を指定した場合、そのグレイ コード シーケンスを出力する必要があります。以下にいくつかの例を示します

2 ビットのグレイ コード シーケンス

Input = 2 bits
00 - 0
01 - 1
11 - 3
10 - 2
Output = [0,1,3,2]

3 ビットのグレイ コード シーケンス

Input  = 3
000 0
001 1
011 3
010 2
110 6
111 7
101 5
100 4
Output = [0, 1, 3, 2, 6, 7, 5, 4]

私の理解によると、グレイ コード シーケンスは 0 で始まり、グレイ コードでは 2 つの連続する値が 1 ビットだけ異なります。2[0,1,3,2]のグレイ コードと 3 のグレイ コードがどのようにして生まれたのかはわかりません。[0,1,3,2,6,7,5,4]

4

3 に答える 3

0

ハードウェアでは、グレイ エンコーディングは次のように記述されます。

function bin2gray(value : std_logic_vector) return std_logic_vector is
  variable result       : std_logic_vector(value'range);
begin
  result(result'left)   := value(value'left);
  for i in (result'left - 1) downto result'right loop
    result(i) := value(i) xor value(i + 1);
  end loop;
  return result;
end function; 

出典: PoC.utils

どういう意味ですか?入力の最上位ビット (MSB) が結果にコピーされます。ここで、ループはすべての入力ビットを MSB-1 から LSB までトラバースし、このビットを左隣のビットと xor します。

例:

in = 0x2 = 0010b
res(3) := 0
res(2) := in(3) xor in(2) = 0
res(1) := in(2) xor in(1) = 1
res(0) := in(1) xor in(0) = 1
return 0011
于 2015-07-28T22:09:29.013 に答える
0

n ビットのグレー コードを生成する通常の方法は、n-1 ビットに 0 をプレフィックスとして付けたシーケンスを取り、次に n-1 ビットに 1 をプレフィックスとして付けた逆のシーケンスをとることです。1 ビットの基本ケース シーケンスは 0, 1 です。このシーケンスを生成する再帰関数を簡単に作成できます。

void printgrey(int len, int pfx=0, int rev=0) {
    if (--len >= 0) {
        printgrey(len, pfx + (rev<<len), 0);
        printgrey(len, pfx + (!rev<<len), 1);
    } else
        printf("%d\n", pfx);
}
于 2015-07-28T21:33:31.470 に答える
0

グレイ コード シーケンスを生成する最も簡単な方法は、通常の数値シーケンスから開始し、各数値を 1 ビット右にシフトして xor することです。Python では、次のようになります。

def graycodes(bits):
    return [x ^ (x >> 1) for x in range(1 << bits)]

>>> graycodes(2)
[0, 1, 3, 2]
>>> graycodes(3)
[0, 1, 3, 2, 6, 7, 5, 4]
>>> graycodes(4)
[0, 1, 3, 2, 6, 7, 5, 4, 12, 13, 15, 14, 10, 11, 9, 8]
于 2021-03-09T04:12:47.783 に答える