3

n ビットのグレイ コードを反復処理する方法は多数あります。いくつかは他よりも効率的です。ただし、実際にはグレイ コードは必要なく、実際のグレイ コードではなく、グレイ コード リストで変更されたビット インデックスを反復処理したいと考えています。たとえば、次の 3 ビットのグレイ コード リストを見てください。

000、001、011、010、110、111、101、100

3、2、3、1、3、2、3 を出力したいと思います。これは、リストを取得するためにビット 3、2、3 などを変更する必要があることを示しています。ここでは、1 と左からインデックスを付けています。

これを行う 1 つの方法は、グレー コードを順番に計算し、連続するペア (x, y) ごとに (x XOR y) を計算してどのビットが変化したかを特定し、(x XOR y) の整数対数底 2 を取得することです。

ただし、反復をできるだけ高速にする必要があり、30 ~ 40 ビットのグレイ コードに関心があります。

これを行う効率的な方法はありますか?

4

2 に答える 2

2

たとえば、GCC 組み込み関数を使用する C を使用している場合 (そして、ベクトル化できるようにアセンブリ出力を細かく制御できる言語を使用する必要があります)、次のことができます。

long long ctr = 0LL;
int next() { return __builtin_ctzll(++ctr); }

これは、 counter の末尾のゼロをカウントして、0、1、0、2、0、1、0、3、0、1、... を返しますctr

適宜翻訳します。

于 2016-12-19T01:49:54.250 に答える