今天来学习一下c++中的lowbit原理,这是一个非常有用的位运算技巧,可以帮助我们快速求出一个数的二进制表示中最低位的1以及它对应的值。
lowbit的定义:
对于任意一个整数x,lowbit(x) = x & (-x),其中&表示按位与运算,-x表示x的相反数。为什么这样定义呢?我们可以用一个例子来解释一下。
lowbit的推演:
假设x = 12,那么它的二进制表示是1100,它的相反数-x = -12,它的二进制表示是补码形式,即先取反得到0011,再加1得到0100。然后我们把x和-x按位与起来,得到lowbit(x) = 1100 & 0100 = 0100,这就是x的最低位的1以及它对应的值,也就是4。
那么lowbit有什么用呢?
我们可以利用它来实现一些高效的算法,比如求一个数的二进制表示中有多少个1,或者维护一个数组的前缀和,快速求树状数组的层数 等等
lowbit 也可以快速求出这个二进制数的末尾有几个0, lowbit(x) = ,k 则表示末尾有几个零