反射灰色代码中的幻数到二进制转换

时间:2014-02-21 09:27:54

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

我写了一个通用函数来将二进制反射的格雷码转换为标准二进制。我使用了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一起使用而不与任何其他系数一起使用。

有人知道这个神奇数字实际对应的是什么吗?

1 个答案:

答案 0 :(得分:5)

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

你的格雷码解码算法从给定整数类型的左半部分开始,并将其移到该类型的右半部分,恰好是右边的sizeof(type) * (CHAR_BIT / 2)位,这正是你的意思正在看。

正如评论中指出的那样,std::numeric_limits<type>::digits / 2将是更加惯用的C ++解决方案。