查找 C++ 中唯一设置位的位置
在这个问题中,我们给出了一个数字 N,它的二进制表示中只有一个设置位。我们的任务是找到唯一设置位的位置。如果数字只有一个设置位,则返回数字的位置,否则打印无效数字。
让我们举个例子来理解这个问题,
输入
N = 32输出结果
6
解释
Binary representation of the number is 10000.
解决方法
在我们进一步进行之前要知道的一个事实是,如果它是 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<<"无效号码!";
else
cout<<"号码的位置 "<<n<<" is "<<findPostionOfSetBit(n);
return 0;
}
号码的位置 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<<"无效号码!";
else
cout<<"号码的位置 "<<n<<" is
"<<findPostionOfSetBit(n);
return 0;
}
号码的位置 64 is 7
解决问题的另一种方法是使用数学公式。我们知道,
2i = n, where n is the numberand i is 号码的位置
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<<"无效号码!";
else
cout<<"号码的位置 "<<n<<" is "<<findPostionOfSetBit(n);
return 0;
}
号码的位置 64 is 7
以上是 查找 C++ 中唯一设置位的位置 的全部内容, 来源链接: utcz.com/z/311411.html