0

nビットのすべての可能な2^n状態にわたってCでループを作成したいと思います。たとえば、n = 4の場合、0000、0001、0010、0011、...、1110、1111をループします。ビットは任意の方法で表すことができます。たとえば、値が0または値がnの長さnの整数配列です。 1、または値が「0」または「1」の長さnの文字配列など、実際には問題ではありません。

小さいnの場合、私が行うことは、整数演算(nとxの両方が整数)を使用してx = 2 ^ nを計算し、次に

for(i=0;i<x;i++) {
    bits = convert_integer_to_bits( i );
    work_on_bits( bits );
}

ここで、「ビット」はビットの指定された表現にあります。これまでに有用だったのは、値が0または1の長さnの整数配列です(ただし、他の値でもかまいません)。

n> 32の場合、このアプローチは明らかにロングでも機能しません。

n> 32でどのように作業しますか?

具体的には、本当に2 ^ nを評価する必要がありますか、それとも2 ^ nの実際の値を参照しないが、それでも2 ^ n回繰り返すループを書くためのトリッキーな方法はありますか?

4

2 に答える 2

1

n > 32 の場合は を使用しますunsigned long long。これは 64 までの n で機能します。値が 50 に近い場合でも、サイクルが終了するまで長時間待たなければなりません。

于 2013-03-05T12:13:15.967 に答える
0

n> 32の場合、明らかに機能しないと言う理由は明らかではありません。あなたの懸念はビットの幅ですか、それとも実行時間の懸念ですか?

数値の幅が気になる場合は、 http: //gmplib.org/などの大きな数学ライブラリを調べてください。

実行時間が心配な場合...幅が十分に大きいとループが完了するのに十分な長さではないので、別の趣味を取得してください;)真剣に...1回の反復の大まかな実行時間を把握してくださいループを介して、それを40億で乗算し、20年で除算すると、答えを待つ必要がある祖先の世代数の見積もりが得られます。

于 2013-03-05T12:15:22.560 に答える