32 ビット整数 n より大きい最小の 2 のべき乗を見つけるためのコードに出くわしました...
n+=(n==0);
n--;
n|=n>>1;
n|=n>>2;
n|=n>>4;
n|=n>>8;
n|=n>>16;
n++;
今、それはどのように機能しますか?n=100 の場合、各ステップの後に基数 2 で数値を出力しようとしましたが、あまり意味がありませんでした。その背後にあるロジックは何ですか?
32 ビット整数 n より大きい最小の 2 のべき乗を見つけるためのコードに出くわしました...
n+=(n==0);
n--;
n|=n>>1;
n|=n>>2;
n|=n>>4;
n|=n>>8;
n|=n>>16;
n++;
今、それはどのように機能しますか?n=100 の場合、各ステップの後に基数 2 で数値を出力しようとしましたが、あまり意味がありませんでした。その背後にあるロジックは何ですか?
このコードは、指定された数値のすべての最下位ビットn
をバイナリ1
s で埋め、その後、結果を だけ増やして1
、要求された結果を達成します。たとえば、入力101
の場合、ビット操作は生成され、それ111
による増加後は(8) になります。これは実際には(5)より大きい 2 の最小累乗です。1
1000
101
更新: 実際には、これは各 lsb ビットを手動で設定するだけの簡単な方法に対する最適化です。この最適化が同じ結果を達成する理由は、この問題を超えたより広い範囲での別の問題です。
実際には、2 の累乗以上の最小値を検出し、n
32 ビットの符号なし数値に対して機能します。
icepack の回答への追加: hereで説明されているように、アルゴリズムは を計算し1 << (floor(log_2(n - 1)) + 1)
ます。