lowbit
x & -x ,x & (~x + 1),x - (x & (x - 1))
树状数组
lowbit算法
int lowbit(int x)
{
return x & -x;
}
int lowbit(int x)
{
return x - (x & (x - 1));
}
int lowbit(int x)
{
return x & (~x + 1);
}
int main() {
int u;
cin>>u;
cout<<bitset<16>(u)<<endl;
cout<<bitset<16>(~u)<<endl;
cout<<bitset<16>(-u)<<endl;
cout<<lowbit(u)<<endl;
return 0;
}
8
0000000000001000
1111111111110111
1111111111111000
8
当x为奇数
奇数的二进制最后一位必定为1,取反后为0。加一并不会涉及到进位,所以x为奇数 x& -x = 1。
当x为偶数
偶数的二进制取反加1一定会涉及到进位
如上图8的二进制为0000000000001000
取反为1111111111110111
取反后加一为1111111111111000,也就是-8。
最后结果是 x& -x = 8;
规律:
无论是正数负数还是零,从最后一位向前找一,找到的第一个一截止,就是求的lowbit。