说明
lowbit(n)函数取出n在二进制表示下最低位的1以及它后面的0构成的数值,x - lowbit(x)操作去掉最低位的‘1’
lowbit(x) = n & (~n+1);
x = x - lowbit(x);
原理
(1) 假设 x 最低位的 ‘1’ 在第 k 位上
(2) 则按位取反 (~ n) 的二进制的第 k 位为0, 0~k-1位全部为1,(k+1 ~ inf) 位也被取反
(3) 于是 (~ n + 1) 由于进位,(0 ~ k-1) 位全部为0,第k位为1, (k+1 ~ inf) 位仍然和原来相反
(4) 那么n&(~ n + 1)自然就只剩下最低位的1以及它后面的0构成的数值了
由于补码下:
~ n=-1-n
所以有
lowbit(x) = x & (