【发布时间】: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