在这个问题中,给我们一个数字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