【问题标题】:Magic number in reflected gray code to binary conversion反射格雷码到二进制转换中的幻数
【发布时间】:2014-02-21 09:27:53
【问题描述】:

我编写了一个通用函数来将二进制反射格雷码转换为标准二进制。我使用了在this page 上找到的算法。这是前面提到的算法:

unsigned short grayToBinary(unsigned short num)
{
        unsigned short temp = num ^ (num>>8);
        temp ^= (temp>>4);
        temp ^= (temp>>2);
        temp ^= (temp>>1);
        return temp;
}

然后我修改了代码,使其适用于任何标准的unsigned 类型。这是我写的:

template<typename Uint>
Uint grayToBinary(Uint value)
{
    for (Uint mask = sizeof(Uint)*4 ; mask ; mask >>= 1)
    {
        value ^= value >> mask;
    }
    return value;
}

该算法似乎适用于每个unsigned 标准类型。但是,在编写它时,我本能地使用了sizeof(Uint)*4,因为结束条件取决于类型大小是有道理的,但事实是我不知道sizeof(Uint)*4 实际代表什么。目前,这是我本能地写下的一个神奇数字,但我无法解释为什么它适用于 *4 而不适用于任何其他系数。

有人知道这个幻数实际上对应的是什么吗?

【问题讨论】:

  • 等等,你是说你写了这段代码,但不明白它为什么会起作用?
  • @OliCharlesworth 这在 CS 中非常常见
  • 不,他是说他认为它有效。
  • @OliCharlesworth 好吧,我改编了一个我没有 100% 理解的已经可以工作的代码,它恰好可以工作(至少,我所有的单元测试都工作)。我知道,很遗憾^^"

标签: c++ algorithm c++11 magic-numbers gray-code


【解决方案1】:

4 恰好是 8 / 2 [需要引用] 或 CHAR_BIT / 2

您的格雷码解码算法首先取给定整数类型的左半部分,然后将其移到该类型的右半部分,恰好是 sizeof(type) * (CHAR_BIT / 2) 位,这正是您所看到的.

正如 cmets 中所指出的,std::numeric_limits&lt;type&gt;::digits / 2 将是 C++ 更惯用的解决方案。

【讨论】:

  • 我应该假设8 代表CHAR_BIT
  • 8 代表一个字节的位数。
  • CHAR_BIT 也是如此。这大概就是我的想法:)
  • 顺便说一句,对于想要一个惯用的 C++ 解决方案的人,而不是 sizeof(type) * (CHAR_BIT / 2),最好使用 std::numeric_limits&lt;type&gt;::digits / 2
  • @Morwenn 这是个好主意。如果我将其添加到我的答案中,您介意吗?
猜你喜欢
  • 2011-07-05
  • 2021-06-17
  • 1970-01-01
  • 2016-10-06
  • 2016-03-05
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多