這兩天有點閒,划水太嚴重。沒有學習啥東西,跑去翻了一下書,看到 &
, |
, ^
, ~
, <<
,>>
這些位運算。而後就想起來了計算機的 原碼
,反碼
和 補碼
。感受寫了兩年的前端,我好像早已把這些東西拋之腦後,對於位運算我好像也沒用過。寫這個算是給本身複習,記錄一下吧。javascript
在這以前咱們能夠先了解一下機器數和真值。機器數是將符號"數字化"的數,是數字在計算機中的二進制表示形式。機器數有兩個特色:一是符號數字化,二是其數的大小受機器字長的限制。真值是指在必定的時間及空間(位置或狀態)條件下,被測量所體現的真實數值。真值是一個變量自己所具備的真實值,它是一個理想的概念,通常是沒法獲得的。因此在計算偏差時,通常用約定真值或相對真值來代替。一般所說的真值能夠分爲「理論真值」、「約定真值」和「相對真值」。前端
計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示「正」,用1表示「負」,而數值位,三種表示方法各不相同。java
原碼:是一種計算機中對數字的二進制定點表示方法。原碼錶示法在數值前面增長了一位符號位(即最高位爲符號位):正數該位爲0,負數該位爲1(0有兩種表示:+0和-0),其他位表示數值的大小。學習
反碼:反碼一般是用來由原碼求補碼或者由補碼求原碼的過渡碼。反碼跟原碼是正數時,同樣;負數時,反碼就是原碼符號位除外,其餘位按位取反。spa
補碼:正數的補碼就是其自己,負數的補碼是在其原碼的基礎上, 符號位不變, 其他各位取反, 最後+1。code
數值 | 原碼 | 反碼 | 補碼 |
---|---|---|---|
+1 | 0000 0001 | 0000 0001 | 0000 0001 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
&
只有對應的兩個二進位都爲1時,結果位才爲1。參與運算的兩個數均以補碼出現。cdn
5 & 6
0000 0101
0000 0110
--------
00000100
// 將 0000 0100 轉換爲十進制爲 4
-5 & 6
1111 1011
0000 0110
--------
0000 0010
// 將 0000 0010 轉換爲十進制爲 2
複製代碼
|
只要對應的兩個二進位有一個爲1時,結果位就爲1。當參與運算的是負數時,參與兩個數均以補碼出現。ip
3 | 4
0000 0011
0000 0110
---------
0000 0111
// 將 0000 0111 轉換爲十進制爲 7
-3 | 4
1111 1101
0000 0100
---------
1111 1101
// 逐位取反 + 1
1000 0011
// 將 1000 0011 轉換爲十進制爲 -3
複製代碼
^
若是對應的兩個二進位值不相同,則異或結果爲1。若是對應的兩個二進位值相同,異或結果爲0。it
7 ^ 8
0000 0111
0000 1000
---------
0000 1111
// 將 0000 1111 轉換爲十進制爲 15
-7 ^ 8
1111 1001
0000 1000
---------
1111 0001
// 逐位取反 + 1
1000 1111
// 將 1000 1111 轉換爲十進制爲 -15
複製代碼
~
二進制值每一位取反,0變1,1變0。io
~10
0000 1010
---------
0111 0101
// 逐位取反 + 1
1000 1011
// 將 1000 1011 轉換爲十進制爲 -11
~-10
1000 1010
---------
1111 0110
// 逐位取反 + 1
0000 1001
// 將 0000 1001 轉換爲十進制爲 9
複製代碼
<<
參加運算的數換算爲二進制後,進行左移運算,用來將一個數各二進制位所有向左移動若干位。
10 << 2
0000 1010
---------
0010 1000
// 將 0010 1000 轉換爲十進制爲 40
-10 << 2
1000 1010
---------
// 先求補碼,按位取反 + 1
1111 0110
// 左移 2 位
1101 1000
// 求補碼,按位取反 + 1
1010 1000
// 將 1010 1000 轉換爲十進制爲 -40
複製代碼
>>
參加運算的數換算爲二進制後,進行左移運算,用來將一個數各二進制位所有向右移動若干位。
10 >> 2
0000 1010
---------
0000 0010
// 將 0000 0010 轉換爲十進制爲 2
-10 >> 2
1000 1010
---------
// 先求補碼,按位取反 + 1
1111 0110
// 右移 2 位
1111 1101
// 求補碼,按位取反 + 1
1000 0011
// 將 1010 1000 轉換爲十進制爲 -3
複製代碼
最高位爲符號位!
公衆號:前端講堂
公衆號ID:js-say