lowbit ( n ) 定义为非负整数 n 在二进制表示下 “ 最低位的 1 及其后面的所有的 0 ” 的二进制构成的数值。
比如当 n = 5 的时候,5 的二进制是 :0101 , 所以有:lowbit ( 5 ) = 1
比如当 n = 10 的时候,10 的二进制是 :1010,所以有: lowbit ( 10 ) = 2
lowbit运算 C / C++ 实现语句 :
1 . 函数
int lowbit(int x){
return x & -x ;
}
2 . 宏定义
#define lowbit(x) ((x)&(-x))
现在我们来证明一下 lowbit ( n ) 运算是怎么进行运算的:
我们假设 n > 0 ,设 n 的二进制表示中,第 k 位为 1 ,第 0 至第 k-1 位都为 0
现在我们对 n 的二进制进行取反操作,可以得到,~n 的二进制表示中,第 k 位为 0 ,第 0 至第 k-1 位都为 1,然后我们再将 ~n 进行加 1 操作,可以得到一个结果,就是 ~n+1 的第 k+1 位至其最高位都为 n 的二进制表示中相反的数字,然后我们再将 ~n+1 与 n进行与运算,就可以得到我们想要的结果了。又因为 ~n=-1-n ,所以 -n = ~n+1,有:
lowbit( x ) = n & ( ~n + 1 ) = n & ( -n )
上面写的很抽象,我们假设 n = 8
8 的二进制为 : 0 0 0 0 1 0 0 0
对 8 取反的二进制为 :1 1 1 1 0 1 1 1
再对 取反8加一的二进制为 :1 1 1 1 1 0 0 0
进行与操作之后 : 0 0 0 0 1 0 0 0
就得到了我们的 lowbit ( 8 ) = 8