1. 程式人生 > >樹狀數組lowbit()函數原理的解釋 x&(x^(x-1)) x&-x

樹狀數組lowbit()函數原理的解釋 x&(x^(x-1)) x&-x

bit 函數 數字 神奇 按位與 樹狀 計算 1=1 運用

樹狀數組lowbit()函數所求的就是最低位1的位置所以可以通過位運算來計算

樹狀數組通過 x&(x^(x-1)) 能夠成功求出lowbit的原因:

首先設x=6,即110(2) 於是我們使 x-1=101 可以發現,當我們將一個二進制數減一時,從最低位一(即lowbit)開始向後的部分與之前全部相反,因為減去的1對後面的每一位都有影響,同時因為是二進制,影響就是讓每一位都取反了

110

101

從最低位一(第二位)開始向後全部相反了 所以我們再與 x 異或一發,那麽從lowbit開始往後全是1

110^101=011

然後我們再用x與新數按位與一下 因為 x lowbit 以前的部分是1或0,lowbit 是1,之後的部分都是0,新數 lowbit 之前的部分都是0,lowbit 是1,之後的部分都是1 所以與完之後他們的交集就是 lowbit

110&011=010

而 lowbit 的常用計算方法是 x&-x ,其原理與上面的方法不盡相同 這個式子運用了計算機的補碼計算原理 補碼計算簡單來講就是原碼的反碼反加一 如:

0110(2)=6

其補碼為: 0110

變為反碼後為 0001

再加一為 0010

可以發現變為反碼後 x 與反碼數字位每一位都不同, 所以當反碼加1後神奇的事情發生了,反碼會逢1一直進位直到遇到0,且這個0變成了1,所以這個數最後面出現了一個 100… 串。 由於是反碼,進位之後由於1的作用使進位的部分全部取反及與原碼相同,所以可以發現 lowbit 以前的部分 x 與其補碼即 -x 相反, lowbit x 與 -x 都是1,lowbit 以後 x 與 -x 都是0 所以 x&-x 後除了 lowbit 位是1,其余位都是0

樹狀數組lowbit()函數原理的解釋 x&(x^(x-1)) x&-x