我编写了一个通用函数,将二进制反射的格雷码转换为标准二进制。我使用了在此页面上找到的算法。这是前面提到的算法:
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
而不是任何其他系数。
有谁知道这个神奇的数字实际上对应于什么?
4
恰好是8 / 2
[需要引用]或CHAR_BIT / 2
。
您的格雷码解码算法首先获取给定整数类型的左半部分,然后将其移动到类型的右半部分,这恰好是右边的sizeof(type) * (CHAR_BIT / 2)
位,这正是您所看到的。
正如评论中指出的那样,std::numeric_limits<type>::digits / 2
将是C++更惯用的解决方案。