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
广告