位運算

位運算

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,轉換爲十六進制:0xFFFFFFFBtable

二進制求整

如補碼是: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;
相關文章
相關標籤/搜索