バイナリ反射グレーコードを標準バイナリに変換する汎用関数を作成しました。このページで見つけたアルゴリズムを使用しました。前述のアルゴリズムは次のとおりです。
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
他の係数では機能せず、なぜ機能するのか説明できません。
このマジックナンバーが実際に何に対応しているか知っている人はいますか?