做爲在互聯網領域工做的程序員啊,咱們須要不斷地學習。本身也堅持天天刷一兩個 LeetCode 題目,在刷題的過程當中,發現有很多題目都涉及到一些位運算的知識,這篇文章記錄一下。程序員
位運算是把數字用二進制表示以後,對每一位上 0 或 1 的運算。bash
接下來咱們舉一個例子一個個運用下方的運算符。學習
將參與運算的兩個數字,換算爲二進制進行運算。只有當相應位上的數都是 1 時,該位取 1,不然取 0。ui
將數字 3 與 2 進行按位於運算
1 1 3的二進制
1 0 2的二進制
————
1 0 結果的二進制,對應十進制數字爲 2
因此:3 & 2 = 3
複製代碼
將參與運算的兩個數字,換算爲二進制進行運算。只要相應位上數是有 1 時,該位取 1,不然取 0。spa
將數字 3 與 2 進行按位或運算
1 1 3的二進制
1 0 2的二進制
----
1 1 結果的二進制,對應十進制數字爲 3
因此:3 | 2 = 3
複製代碼
將參與運算的兩個數字,換算爲二進制進行運算。只要相應位上數不相同時,該位取 1,不然取 0。code
將數字 3 與 2 進行按位異或運算
1 1 3的二進制
1 0 2的二進制
----
0 1 結果的二進制,對應十進制數字爲 1
因此:3 ^ 2 = 1
複製代碼
將參與運算的兩個數字,換算爲二進制進行運算。將二進制位所有向左移動若干位,後續位置補 0 。get
將數字 3 左移 2 位
1 1 3的二進制
1 1 0 0 左移兩位。結果的二進制,對應十進制數字爲 12
因此:3 << 2 = 12
複製代碼
將參與運算的兩個數字,換算爲二進制進行運算。將二進制位所有向右移動若干位,前面空出的位置補 0,後續移出的數字移除。數學
將數字 3 右移 2 位
1 1 3的二進制
0 0 1 1
0 0 結果的二進制。右移兩位,移出去的 1 移除。對應十進制數字爲 0
因此:3 >> 2 = 0
複製代碼
右移運算可用來代替除法,且效率會比除法更高。class
利用右移運算代替除法。
將數字 3 右移 1 位。
1 1 3的二進制
0 1 1
0 1 結果的二進制。右移兩位,移出去的 1 移除。對應十進制數字爲 1
因此:3 >> 1 = 1
複製代碼
首先,咱們須要知道計算機內部在作數學運算時,都是以補碼爲標準的。效率
關於原碼、反碼及補碼的只是這裏很少作介紹了。 這篇文章對這三個碼進行了一些基本介紹。
這裏咱們說一些結論:
取反操做
將參與運算的兩個數字,換算爲二進制進行運算。每一個位置上都取相反值,1 變成 0,0 變爲 1。
例子1:對正數進行取反
對數字 3 進行取反。這裏就利用 8 位來存儲二進制數值。
0 0 0 0 0 0 1 1 3的二進制原碼
1 1 1 1 1 1 0 0 取反以後獲得結果的原碼,咱們須要轉化爲補碼供計算機計算
1 0 0 0 0 0 1 1 根據原碼獲得結果的反碼
1 0 0 0 0 1 0 0 上面反碼基礎上 +1 獲得補碼,其十進制值爲 -4
因此:~3 = -4
複製代碼
例子2:對負數進行取反
對數字 -4 進行取反。這裏就利用 8 位來存儲二進制數值。
其實只是將正數的過程反過來就好。
1 0 0 0 0 1 0 0 -4的二進制補碼
1 0 0 0 0 0 1 1 在補碼的基礎上 -1 獲得反碼
1 1 1 1 1 1 0 0 根據反碼獲得其原碼
0 0 0 0 0 0 1 1 每位取反以後獲得結果的原碼。結果的十進制爲 3
因此:~(-4) = 3
複製代碼