C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でもう1つのセットビット数を持つ次に大きい整数


数値nが与えられているので、バイナリ表現でnよりも1つ多いセットビットを使用して、nよりも大きい数値を見つける必要があります。

2進表現の数字1はセットビットと呼ばれます。

例を見てみましょう。

入力

124

出力

125

アルゴリズム

  • 番号を初期化します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 + 1 == getSetBitsCount(i)) {
         return i;
      }
      i += 1;
   }
}
int main() {
   int n = 124;
   cout << getNextGreaterElementWithSameSetBits(n) << endl;
   return 0;
}

出力

上記のコードを実行すると、次の結果が得られます。

125

  1. 数値に代替パターンのビットがあるかどうかを確認します-C++で1を設定します

    整数nがあるとしましょう。問題は、この整数が2進数に相当する代替パターンを持っているかどうかを確認することです。代替パターンは101010…を意味します。 アプローチは次のようなものです。同等の2進数を使用して各桁をチェックし、2つ連続している場合は偽を返し、そうでない場合は真を返します。 例 #include <iostream> using namespace std; bool hasAlternatePattern(unsigned int n) {    int previous = n % 2;    n = n/2; &nbs

  2. C++で整数の1の補数を見つける

    このセクションでは、整数の1の完全なものを見つける方法を説明します。補数演算子を使用してこのタスクを非常に高速に実行できますが、32ビットの補数値(4バイト整数)になります。ここでは、nビット数の補数が必要です。 22という数値があるとします。2進数に相当するものは10110です。補完された値は01001で、これは9と同じです。ここで問題が発生します。この値を見つける方法は?最初に、与えられた数のビット数を見つける必要があります。カウントがcであると仮定します(ここでは、22の場合はc =5)。 51を作成する必要があります。したがって、これは11111になります。これを行うには、1を左にc