位運算記錄

做爲在互聯網領域工做的程序員啊,咱們須要不斷地學習。本身也堅持天天刷一兩個 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 開頭,反碼是最高符號位不變,其他位在原碼的基礎上取反,補碼在反碼的基礎上 +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
複製代碼
相關文章
相關標籤/搜索