js中的位運算只對整數起做用,由於位操做都有ToInt32這一步,從而捨棄小數部分java
十六進制 | 二進制 |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
A | 1010 |
B | 1011 |
C | 1100 |
D | 1101 |
E | 1110 |
F | 1111 |
計算機中數是以二進制補碼進行存儲的,正數的原碼、反碼、補碼都是同樣,負數的補碼是原碼的反碼再加1,這樣能夠減法運算可使用加法器實現,符號位也參與運算(二進制的最高位爲符號位0爲正,1爲負,以8位來算,最高位爲符號位,其他7位表示數值),取反碼與符號位無關。code
int類型的數佔用4字節(32位)。5轉換成二進制是101,不滿32位會在前面填充0。那麼5在計算機中表示爲:
00000000 00000000 00000000 00000101
原碼:一個整數,按照絕對值大小轉換成的二進制數;
反碼:將二進制數按位取反【1變0,0變1】;
補碼:反碼加 1;數學
如十進制: -5console
原碼: 00000000 00000000 00000000 00000101 反碼:11111111 11111111 11111111 11111010 補碼(反碼加一):11111111 11111111 11111111 11111011
因此 -5 的二進制是 11111111 11111111 11111111 11111011,轉換爲十六進制:0xFFFFFFFB
。table
如補碼是:11111111 11111111 11111111 11110010class
補碼: 11111111 11111111 11111111 11110010 反碼(補碼減一):11111111 11111111 11111111 11110001 按位取反,原碼:00000000 00000000 00000000 00001110
原碼00000000 00000000 00000000 00001110
即14, 而後取反就是 -14。語法
<<
左移運算規則: 按二進制形式把全部的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。
語法格式: 須要移位的數字 << 移位的次數。
數學意義: 若是是10進制向左移動一位至關於乘10倍,移兩位乘10的2次方倍,因此在數字沒有溢出的前提下,對於正數和負數,二進制左移n位就至關於乘以2的n次方。二進制
/** 3 << 2 **/ 3轉化爲二進制: 00000011 移動補位:00001100 轉化爲十進制:12
3 * 2 ^ 2 = 3 * 4 = 12
計算機
爲何沒有無符號左移<<< ?
由於左位移是填補右邊空出的位,符號位不影響它的值。
>>
帶符號右移運算規則: 按二進制形式把全部的數字向右移動對應的位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1。【補的位數所有是符號位】
語法格式: 須要移位的數字 >> 移位的次數
數學意義: 右移一位至關於除2,右移n位至關於除以2的n次方。商若爲小數,取整便可。tab
/** 11 >> 2 **/ 11轉化爲二進制: 0000 1011 移動補位:0000 0010 轉化爲十進制:2
11 / 2^2 = 11 / 4 = 2
例如: -100 >> 4【-100帶符號右移4位】
-100原碼:00000000 00000000 00000000 01100100 -100反碼:11111111 11111111 11111111 10011011 -100補碼:11111111 11111111 11111111 10011100 右移4位,在高位補1:11111111 11111111 11111111 11111001
補碼形式的移位完成後,結果不是移位後的結果,要根據補碼寫出原碼纔是最後的結果。
減一:11111111 11111111 11111111 11111000 按位取反:00000000 00000000 00000000 00000111 添加符號位:10000000 00000000 00000000 00000111 結果:-7
>>>
無符號右移>>>
運算符執行無符號右移位運算,它把無符號的 32 位整數全部數位總體右移。最左側空位再也不用符號位的值來填充,而是用 0 來填充。
// 對於無符號數或正數,無符號右移與有符號右移運算結果相同。 console.log(1000 >> 8); // 3 console.log(1000 >>> 8); // 3 console.log(-1000 >> 8); // -4 console.log(-1000 >>> 8); // 16777212
~
非運算規則: 操做數被轉換爲32位二進制表示(0和1)。超過32位的數字將丟棄其最高有效位。
語法格式: ~ 操做數。
數學意義: 任何數 x 的運算結果都是-(x + 1)
。~-5
運算結果爲`4;
/** ~ 5 **/ 5轉化爲二進制: 00000000 00000000 00000000 00000101 位數取反: 11111111 11111111 11111111 11111010 【補碼】 反碼:11111111 11111111 11111111 11111001 原碼:00000000 00000000 00000000 00000110 添加符號位:10000000 00000000 00000000 00000110 轉化爲十進制: -6 const a = 5; console.log(~a); // -6
&
與運算規則: 第一個操做數的的第n位與第二個操做數的第n位對比,若是都是1,那麼第n位的結果爲1,不然爲0;同真爲真,一假爲假
。
5轉換爲二進制:00000000 00000000 00000000 00000101 3轉換爲二進制:00000000 00000000 00000000 00000011 5 & 3 結果:00000000 00000000 00000000 00000001
5 & 3 結果:00000000 00000000 00000000 00000001, 轉化爲二進制是1;
|
或運算規則: 第一個操做數的的第n位與第二個操做數的第n位對比,只要有一個是1,那麼第n位的結果爲1,不然爲0;一真爲真,同假爲假
5轉換爲二進制:00000000 00000000 00000000 00000101 3轉換爲二進制:00000000 00000000 00000000 00000011 5 | 3 結果:00000000 00000000 00000000 00000111
5 | 3 結果:00000000 00000000 00000000 00000111, 轉化爲二進制是7;
^
異或運算規則: 第一個操做數的的第n位與第二個操做數的第n位對比,若是相反那麼第n位結果的爲1,不然爲0;同爲假,異爲真
5轉換爲二進制:00000000 00000000 00000000 00000101 3轉換爲二進制:00000000 00000000 00000000 00000011 5 ^ 3 結果:00000000 00000000 00000000 00000110
5 ^ 3 結果:00000000 00000000 00000000 00000110, 轉化爲二進制是6;
a & 1 == 0; // 偶數 a & 1 == 1; // 奇數
異或運算有以下特性:a ^ b ^ a = b; a ^ b ^ b = a
x ^= y; y ^= x; x ^= y;