因為樹狀數組要用,所以學習到了。
因為解釋的太好了,我直接copy:
這里利用的負數的存儲特性,負數是以補碼存儲的,對於整數運算 x&(-x)有
●當x為0時,即 0 & 0,結果為0;
●當x為奇數時,最后一個比特位為1,取反加1沒有進位,故x和-x除最后一位外前面的位正好相反,按位與結果為0。結果為1。
●當x為偶數,且為2的m次方時,x的二進制表示中只有一位是1(從右往左的第m+1位),其右邊有m位0,故x取反加1后,從右到左第有m個0,第m+1位及其左邊全是1。這樣,x& (-x) 得到的就是x。
●當x為偶數,卻不為2的m次方的形式時,可以寫作x= y * (2^k)。其中,y的最低位為1。實際上就是把x用一個奇數左移k位來表示。這時,x的二進制表示最右邊有k個0,從右往左第k+1位為1。當對x取反時,最右邊的k位0變成1,第k+1位變為0;再加1,最右邊的k位就又變成了0,第k+1位因為進位的關系變成了1。左邊的位因為沒有進位,正好和x原來對應的位上的值相反。二者按位與,得到:第k+1位上為1,左邊右邊都為0。結果為2^k。
總結一下:
x&(-x),當x為0時結果為0;x為奇數時,結果為1;x為偶數時,結果為x中2的最大次方的因子。
有一個專門的稱呼,叫做lowbit,即取2^k。
甚至還可以進一步運用:求任意數字x的最大2次方因子。
那么當x為奇數的時候就為(x-1)&(-(x-1)),當x為偶數的時候就為x&(-x)。