32 ビットまたは 64 ビットの符号なし整数があるとします。
左端 i ビットの 0 の数が左端 i ビットの 1 の数と等しくなるように、左端ビットのインデックス i を見つける最速の方法は何ですか? ここで述べたようなちょっとしたトリックを考えていました。
最近の x86_64 プロセッサに興味があります。これは、POPCNT (1 の数をカウントする) または LZCNT (先頭の 0 の数をカウントする) などの一部のプロセッサ サポート命令に関連している可能性があります。
それが役立つ場合は、最初のビットが常に特定の値を持っていると仮定することができます。
例 (16 ビットの場合): 整数が
1110010100110110b
^
i
i=10 で、マークされた位置に対応します。
16 ビット整数の可能な (遅い) 実装は次のようになります。
mask = 1000000000000000b
pos = 0
count=0
do {
if(x & mask)
count++;
else
count--;
pos++;
x<<=1;
} while(count)
return pos;
編集: @njuffa コメントに従ってコードのバグを修正しました。