在C++中查找唯一设置位的位 置


在这个问题中,我们得到一个数字N,它的二进制表示中只有一个设置位。我们的任务是找到唯一设置位的位 置。如果数字只有一个设置位,则返回数字的位 置,否则打印无效数字。

让我们举个例子来理解这个问题:

输入

N = 32

输出

6

解释

Binary representation of the number is 10000.

解决方案方法

在我们继续之前,需要知道一个事实:如果一个数字是2的幂,则它只有一个设置位。否则,它将有多个设置位。

一个简单的解决方案是从最右边的位开始,然后检查位的数值。我们将使用循环来检查它是否已设置。

程序说明了我们解决方案的工作原理:

示例

 在线演示

#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

还有一种方法可以使用数学公式来解决这个问题。我们知道:

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

更新于:2021年3月16日

1K+ 浏览量

启动你的职业生涯

完成课程获得认证

开始学习
广告