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

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

让我们举个例子来了解这个问题,

输入-4

输出-3

说明-4的二进制数是100,最右边的设置位的索引是3。

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

一个更有效的解决方案是使用布尔代数。为此,我们将首先计算数字的2的补数,这将翻转数字的所有位,而保留第一个置位位。然后,我们将计算该数字的按位&,它是2的补数。这将产生一个只有一个设定位和所需位置的数字。解决方案将由数字+1的log2给出。

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

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