a&(-a)在C++里面是什么意思?有那些应用?

做逆序对模板的时候遇到的问题,不知道a&(-a)在代码里是什么用。。。。。
求解答。

对于是用补码的环境,a和-a相与可以获得a最低的非0位。
-a就是a取反加1
比如a的二进制是 ??????10000,取反就是??????01111,加1就是??????10000。前面?的部分是和原来a相反的,相与必然都是0,所以最后整体相与的结果就是00000010000。追问

for(;j0;k-=(-k)&k)
s+=c[k];
ans+=i-s;
如上,求解逆序对的时候获得最低非0位用什么作用?(树状数组求逆序对 lowbit)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-10-12
先负运算再进行与运算,应用同加减乘除