2

バイナリ反射グレーコードを標準バイナリに変換する汎用関数を作成しました。このページで見つけたアルゴリズムを使用しました。前述のアルゴリズムは次のとおりです。

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

1 に答える 1

5

4たまたま8 / 2[要出典]、またはCHAR_BIT / 2.

グレイ コード デコード アルゴリズムは、指定された整数型の左半分を取得することから開始し、それを型の右半分にシフトします。これはたまたまsizeof(type) * (CHAR_BIT / 2)右側のビットであり、まさにあなたが見ているものです。

コメントで指摘されているように、std::numeric_limits<type>::digits / 2C++ のより慣用的なソリューションになります。

于 2014-02-21T09:38:57.697 に答える