C++で同じ数のセットビットを持つ次に大きい数
数値nが与えられているので、バイナリ表現のnと同じセットビット数でnより大きい数値を見つける必要があります。
2進表現の数字1はセットビットと呼ばれます。
例を見てみましょう。
入力
124
出力
143
アルゴリズム
-
番号を初期化しますn。
-
設定されたビット数のカウントを取得する関数を記述します。
-
n+1で反復変数を初期化します。
-
無限ループを記述します。
-
nのセットビット数と等しい数のセットビット数を確認します。
-
見つけたら番号を返します。
- 番号を増やします。
-
実装
以下は、C++での上記のアルゴリズムの実装です
#include <bits/stdc++.h>
using namespace std;
int getSetBitsCount(int n) {
int count = 0;
while (n) {
if (n % 2 == 1) {
count += 1;
}
n /= 2;
}
return count;
}
int getNextGreaterElementWithSameSetBits(int n) {
int setBitsCount = getSetBitsCount(n);
int i = n + 1;
while (true) {
if (setBitsCount == getSetBitsCount(i)) {
return i;
}
i += 1;
}
}
int main() {
int n = 124;
cout << getNextGreaterElementWithSameSetBits(n) << endl;
return 0;
} 出力
上記のコードを実行すると、次の結果が得られます。
143
-
C++でkセットビットの数を最大化するために必要な最小フリップ。
問題の説明 2つの数値nとkが与えられた場合、結果の数値が正確にkセットビットになるようにビットを反転することにより、指定された数値を最大化するために必要な最小の反転数を見つける必要があります。入力は、k
-
Pythonのnと同じセットビット数でより高い数を見つけるプログラム?
数nがあるとします。バイナリ形式のnと同じ数の1で、次に大きい最小の数を見つける必要があります。 したがって、入力がn =7の場合、出力は11になります。これは、バイナリの7が0111であり、3つの7から次に高い値が11になり、バイナリの1011になります。 これを解決するには、次の手順に従います。 コピー:=n、ゼロ:=0、1:=0 コピーが0ではなく、コピーが偶数である場合は、実行してください ゼロ:=ゼロ+ 1 コピー=コピー/2 コピーは奇妙ですが、実行してください ones:=ones + 1 コピー=コピー/2 右: