位運算 深入理解並證明 lowbit 運算

2021-09-28 08:03:45 字數 923 閱讀 4446

比如當 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異或...