【位运算】深入理解并证明 lowbit 运算

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

发布了177 篇原创文章 · 获赞 282 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/lesileqin/article/details/102418143