比如當 n = 5 的時候,5 的二進位制是 :0101 , 所以有:lowbit ( 5 ) = 1
比如當 n = 10 的時候,10 的二進位制是 :1010,所以有: lowbit ( 10 ) = 2
lowbit運算 c / c++ 實現語句 :
1 . 函式
int lowbit(int x)
2 . 巨集定義
#define lowbit(x) ((x)&(-x))
現在我們來證明一下 lowbit ( n ) 運算是怎麼進行運算的:
我們假設 n > 0 ,設 n 的二進位制表示中,第 k 位為 1 ,第 0 至第 k-1 位都為 0
現在我們對 n 的二進位制進行取反操作,可以得到,~n 的二進位制表示中,第 k 位為 0 ,第 0 至第 k-1 位都為 1,然後我們再將 ~n 進行加 1 操作,可以得到乙個結果,就是 ~n+1 的第 k+1 位至其最高位都為 n 的二進位制表示中相反的數字,然後我們再將 ~n+1 與 n進行與運算,就可以得到我們想要的結果了。又因為 ~n=-1-n ,所以 -n = ~n+1,有:
lowbit( x ) = n & ( ~n + 1 ) = n & ( -n )
上面寫的很抽象,我們假設 n = 8
8 的二進位制為 : 0 0 0 0 1 0 0 0
對 8 取反的二進位制為 :1 1 1 1 0 1 1 1
再對 取反8加一的二進位制為 :1 1 1 1 1 0 0 0
進行與操作之後 : 0 0 0 0 1 0 0 0
就得到了我們的 lowbit ( 8 ) = 8
Java 位運算子 深入理解
作用是對運算子兩側以二進位制表達的操作符按位分別進行 與 運算。而這一運算是以數中同樣的位 bit 為單位的。操作的規則是 僅當兩個運算元都為1時。輸出結果才為1。否則為0 示比例如以下 12 的二進位制為 0000 1100.5 的二進位制為 0000 0101.則 12 5 的二進位制為 000...
深入理解並查集
並查集是一種樹形結構,它是由並查集演算法進行維護的。而並查集演算法 union find algorithm 顧名思義,它主要是由 合併集合 和 查詢集合 合併集合 是將兩個連通的集合合併為乙個集合,查詢集合 判斷某個節點的代表節點,也就是根節點。圖的連通狀態如上圖所示,共分為三個集合,灰色 藍色 ...
深入理解按位異或運算子
小步不停注 文章 參與運算的兩個值,如果兩個相應bit位相同,則結果為0,否則為1。即 0 0 0,1 0 1,0 1 1,1 1 0 例如 10100001 00010001 10110000 按位異或的3個特點 1 0 0 0,0 1 1 0異或任何數 任何數 2 1 0 1,1 1 0 1異或...