2012-06-15 19 views
5

ちょうどkビットが設定された最小の整数、つまり別の整数xより大きい値を計算したいとします。例えば別の整数xより大きいkビットのセットで最小の整数を計算しますか?

、答えはk=4ため1010000 でなければなりませんk=2ため そしてx = 1001010場合、答えは1001011 あるべきとk=5のための答えは、私は1つが、少なくとも同じに設定する必要があるだろうと思い1001111

です整数xに設定されている左端のビットとして多くのビットを設定し、次に左端のセットビットに隣接するMSB側のビットをxに設定するか、次に左端のセットビットを設定してから、ザ・サ私は処理する。 kの残りのビットを数えながらすべて

これが正しいアプローチであるかどうかはわかりません。

+0

理解することは、あなたの質問にははるかに容易になりますサンプル入力/出力を提供します。 2つの整数のビット数を同じにする必要がありますか? – xvatar

+0

@xvatar私は 'x'と' k'は両方ともプログラムの入力、すなわち 'x = 1001010'、' k = 2'は '1010000'を返すと思います – ffao

+2

これは宿題ではありませんよね? –

答えて

6
++x; 

while (popcnt(x) > k) 
{ 
    // Substitute the least-significant group of bits 
    // with single bit to the left of them 
    x |= x-1; 
    ++x; 
} 

unsigned bit = 1; 
while (popcnt(x) < k) 
{ 
    x |= bit; 
    bit <<= 1; 
} 

第二のループを最適化することができる。

for (i = k - popcnt(x); i != 0; --i) 
{ 
    // Set the lowest non-set bit 
    x |= x+1; 
} 
+0

最初のwhileループはきちんとしたトリックです。うまくやった! – ffao

+0

@ffao:D.Knuthによる "コンピュータプログラミングの芸術、vol。4A"にこのようなトリックがたくさんあります。または["Matters Computational"](http://www.jjj.de/fxt/#fxtbook)を参照してください。 –

+0

@EvgenyKluev答え、gcc popcntに私を紹介してくれてありがとう。私はそれについて知らなかったし、おそらく設定されたビットを数えるループを書いただろう。 – adi

関連する問題