【问题标题】:Working of a Gray Code格雷码的工作
【发布时间】:2015-10-19 15:22:59
【问题描述】:

我正在尝试了解格雷码的工作原理。如果我们给出任何非负整数 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的格雷码是怎么来的[0,1,3,2],3的格雷码是怎么来的[0,1,3,2,6,7,5,4]

【问题讨论】:

  • 您正在处理比特 - 2 的幂。 gc(2) -> 2^2 -> 4. gc(3) -> 2^3 -> 8. 由于格雷码只有一位差异,因此这些位序列的排序不是“线性”的。这就是为什么你会得到十进制数字的“随机”排序。
  • 好的。所以你说如果我给 2 那么它的 gc 变为 2^2 = 4。所以,它的 gc 变为 [0,1,2,3] 并且顺序可能会有所不同。同样,在 3 的情况下,gc 变为 2^3 = 8。我仍然不确定,因为 en.wikipedia.org/wiki/Gray_code 声明 3 的格雷码将是 [0,1,3,2,6,7,5,4]。如果我错了,请纠正我。
  • 2 位格雷码可以有 2^2 = 4 个值。 3bit 有 8 个值,等等等等。没有什么神奇的。这只是简单的二进制编号。使它成为格雷码的原因是在列表中的任何两个位置之间,只有一位不同。除此之外,它仍然只是一个简单的 4 或 8 或 16 或任何数字列表。但格雷码决定了数字的顺序。

标签: gray-code


【解决方案1】:

生成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);
}

【讨论】:

    【解决方案2】:

    在硬件中灰度编码描述如下:

    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 的每个输入位,并将该位与它的左邻居异或。

    例子:

    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
    

    【讨论】:

      【解决方案3】:

      生成格雷码序列的最简单方法是从一个正常的数字序列开始,然后将每个数字与自身右移一位进行异或。在 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]
      

      【讨论】:

        猜你喜欢
        • 2018-09-16
        • 1970-01-01
        • 2010-12-14
        • 2017-01-12
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 2015-08-11
        • 1970-01-01
        相关资源
        最近更新 更多