Mor*_*enn 2 c++ algorithm magic-numbers gray-code c++11
我写了一个通用函数来将二进制反射的格雷码转换为标准二进制.我使用了本页找到的算法.这是上述算法:
unsigned short grayToBinary(unsigned short num)
{
unsigned short temp = num ^ (num>>8);
temp ^= (temp>>4);
temp ^= (temp>>2);
temp ^= (temp>>1);
return temp;
}
Run Code Online (Sandbox Code Playgroud)
然后我修改了代码,使其适用于任何标准unsigned类型.这是我写的:
template<typename Uint>
Uint grayToBinary(Uint value)
{
for (Uint mask = sizeof(Uint)*4 ; mask ; mask >>= 1)
{
value ^= value >> mask;
}
return value;
}
Run Code Online (Sandbox Code Playgroud)
该算法似乎适用于每种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++来说,这将是更为惯用的解决方案.