lowbit(x)得到的是:从低位到高位数,第一个数字1的位置得到的二进制数
比如8=1000,lowbit(8) = 8 2=10 , lowbit(2) = 2, 5 = 110 lowbit(6) = 2
既然这一步是树状数组中最常用的一步,那么树状数组的性能就跟这一步息息相关,所以lowbit的实现非常简单
lowbit(x) = x & (-x)
所以说,大道至简啊,看上去非常简单的一个函数表达式,但是能完美解决我们的问题。
其实这个方法是用到了计算机底层计算用到的是补码的机制。
原码求补码有一个小技巧,那就是除去符号位,从右往左第一个1的下一位开始,所有位直接取反,这个不知道的可以去好好复习一下补码
从右往左第一位,看到这个是不是突然发现有点意思了。一个是原码,一个是补码,如果两个数&一下的话,补码跟原码有相同位的,是不是只有从右往左的第一个1?那么求与的话就肯定能得到我们想要的答案了