C++中求最右边设置位的位数


在这个问题中,我们给定一个数字N。我们的任务是打印该数字最右边设置位的索引。

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

输入 − 4

输出 − 3

解释 − 4的二进制是100,最右边设置位的索引是3。

为了解决这个问题,一个简单的解决方案是将数字移位,直到遇到一个设置位,但是如果数字很大,这可能需要大量的计算。

一个更有效的解决方案是使用布尔代数。为此,我们首先计算该数字的2的补码,这将翻转该数字的所有位,并将第一个设置位保留原样。然后,我们将计算该数字及其2的补码的按位与。这将导致一个只有一个设置位的数字,以及我们想要的位数。该解决方案将由该数字的log2 + 1给出。

这似乎有点复杂,让我们用这种方法解决一个例子。

N= 10 , binary = 1010
2’s complement, 0101
1010 & 0101 = 0010
log2(2) = 1
1+1 = 2 which is the given index.

示例

程序演示了我们解决方案的实现:

 在线演示

#include <iostream>
#include <math.h>
using namespace std;
void rightSetBit(int N) {
   int bitIndex = log2(N & -N)+1;
   cout<<bitIndex;
}
int main() {
   int N = 10;
   cout<<"The rightmost Set bit of the number "<<N<<" is : ";
   rightSetBit(N);
   return 0;
}

输出

The rightmost Set bit of the number 10 is : 2

更新于:2020年4月17日

311 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告