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

C++で唯一の設定ビットの位置を検索します


この問題では、2進表現に1つのセットビットしかない数Nが与えられます。私たちの仕事は、唯一のセットビットの位置を見つけることです。数値に設定ビットが1つしかない場合は、数値の位置を返します。それ以外の場合は、無効な数値を出力します。

問題を理解するために例を見てみましょう

入力

N = 32

出力

6

説明

Binary representation of the number is 10000.

ソリューションアプローチ

先に進む前に知っておくべき1つの事実は、2の累乗の場合、その数は1セットビットしかないということです。それ以外の場合は、より多くのセットビット数があります。

簡単な解決策は、右端のビットから始めて、ビットの値をチェックすることです。ループを使用して、設定されているかどうかを確認します。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
bool isPowerOfTwo(unsigned n) {
   if(n>0) {
      while(n%2 == 0)
      n/=2;
      if(n == 1)
         return true;
   }
   if(n == 0 || n != 1)
      return false;
   return false;
}
int findPostionOfSetBit(unsigned n) {
   unsigned i = 1, position = 1;
   while (!(i & n)) {
      i = i << 1;
      ++position;
   }
   return position;
}
int main(void){
   int n = 64;
   if(!isPowerOfTwo(n))
      cout<<"Invalid Number!";
   else
      cout<<"The position of the number "<<n<<" is "<<findPostionOfSetBit(n);
   return 0;
}

出力

The position of the number 64 is 7

この問題を解決する別の方法は、シフト操作を使用して、数値を0になるまで右にシフトすることです。最後に0に到達するために行われるシフトの数は、設定されたビットの位置です。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
bool isPowerOfTwo(unsigned n) {
   if(n>0) {
      while(n%2 == 0)
         n/=2;
      if(n == 1)
         return true;
   }
   if(n == 0 || n != 1)
      return false;
   return false;
}
int findPostionOfSetBit(unsigned n) {
   unsigned position = 0;
   while (n) {
      n = n >> 1;
      ++position;
   }
   return position;
}
int main(void){
   int n = 64;
   if(!isPowerOfTwo(n))
      cout<<"Invalid Number!";
   else
      cout<<"The position of the number "<<n<<" is
      "<<findPostionOfSetBit(n);
   return 0;
}

出力

The position of the number 64 is 7

この問題を解決するもう1つの方法は、数式を使用することです。私たちはそれを知っています、

2i = n, where n is the number
and i is the position of the number
The values of i here can be found using the formula,
i = log2(n)

ソリューションの動作を説明するプログラム

#include <iostream>
#include <math.h>
using namespace std;
bool isPowerOfTwo(unsigned n) {
   if(n>0) {
      while(n%2 == 0)
         n/=2;
      if(n == 1)
         return true;
   }
   if(n == 0 || n != 1)
      return false;
   return false;
}
int findPostionOfSetBit(unsigned n) {
   unsigned position = log2(n) + 1; ;
   return position;
}
int main(void){
   int n = 64;
   if(!isPowerOfTwo(n))
      cout<<"Invalid Number!";
   else
      cout<<"The position of the number "<<n<<" is "<<findPostionOfSetBit(n);
   return 0;
}

出力

The position of the number 64 is 7

  1. C++を使用して停止ステーションの数を見つける

    ポイントXとYの間にn個の中間駅があります。2つの駅が隣接しないように、s駅に停車するように列車を配置できるさまざまな方法の数を数えます。そのため、この記事では、停車駅の数を見つけるためのあらゆる可能なアプローチについて説明します。問題を見ると、sの駅数で列車を止めることができる組み合わせを見つける必要があることがわかります。 問題を解決するためのアプローチ 中間駅が8つあり、3つの中間駅で電車を止める方法を見つける必要がある例を見てみましょう。 n = 8, s = 3 (n-s)、つまり電車が止まらない駅が5つ残っています 電車が止まらないA、B、C、D、Eの5つの駅があります

  2. C++を使用してセットの反射関係の数を見つける

    この記事では、集合上の反射関係の数を見つけるためのアプローチについて説明します。この問題では、数nが与えられ、n個の自然数のセットで、反射関係の数を決定する必要があります。 反射関係 −集合Aの関係は、(a、a)が集合Aに属するすべてのaがRに属する場合、反射的と呼ばれます。たとえば、- Input : x = 1 Output : 1 Explanation : set = { 1 }, reflexive relations on A * A : { { 1 } } Input : x = 2 Output : 4 Explanation : set = { 1,2 }, reflex