JavaScript的位操作符有:按位非,按位與,按位或,按位異或,左移,有符號的右移,無符號的右移。
基礎:
- ECMAScript 整數有兩種類型:有符號整數(允許用正數和負數)和無符號整數(只允許用正數)。在 ECMAScript 中,所有整數字面量默認都是有符號整數,有符號整數使用 31 位表示整數的數值,用第 32 位表示整數的符號,0 表示正數,1 表示負數。
- ECMAScript中正數以純二進制格式存儲,負數使用是二進制補碼的格式存儲。
- 補碼:正數的補碼就是其本身;負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1。
一、按位非
表示:~
結果:操作數的所有位取反。也等於操作數的負數-1。
var num1 = 20;
var num2 = ~num1;
console.log(num2);//-21
過程:
- num1二進制表示爲 "00000000000000000000000000010100"
- num1每位取反,即"11111111111111111111111111101011"
- num1取反的最高位爲1,表示負數,因爲ECMAScript中負數使用是二進制補碼的格式存儲,所以求"11111111111111111111111111101011"的補碼,即"10000000000000000000000000010101"。
- 將"10000000000000000000000000010101"用十進制表示,即 -21
二、按位與
表示:&
結果:操作數每位對齊,全1爲1,否則爲0
.
var num1 = 14;//01110
var num2 = 20;//10100
var num3 = num1 & num2;
console.log(num3);//4
var n1 = 14;
var n2 = -20;
var n3 = n1 & n2;
console.log(n3);//12
過程:
- num1二進制表示爲"00000000000000000000000000001110",
- num2二進制表示爲"00000000000000000000000000010100"
- 每位對齊相與: "00000000000000000000000000000100",轉爲十進制爲 4。
- 負數是補碼格式存儲,所以 -20 的二進制表示爲:"11111111111111111111111111101100",與num1每位對齊相與,結果爲"00000000000000000000000000001100",即12
三、按位或
表示:|
結果:全0則0,否則爲1。
var num1 = -20;
var num2 = 14;
var num3 = num1 | num2;
console.log(num3);//-18
過程:
- 負數是補碼格式存儲,所以-20的存儲二進制表示爲"11111111111111111111111111101100"
- 14的二進制表示爲"00000000000000000000000000001110"
- 按位或操作,對應位有1則1。爲:11111111111111111111111111101110,最高位爲1,表示負數,負數按補碼格式存儲,所以轉爲補碼爲:10000000000000000000000000010010,用10進製表示爲 -18
四、按位異或
表示:^
結果:操作數的二進制對應位只有一個“1”時結果爲“1”,其餘情況爲“0”
var num1 = -20;
var num2 = 14;
var num3 = num1 ^ num2;
console.log(num3); //-30
過程:
- -20:"11111111111111111111111111101100"
- 14:"00000000000000000000000000001110"
- 對應位只一個“1”則“1”,結果:"11111111111111111111111111100010"
- 結果最高位爲1,表示負數,負數用補碼存儲,所以轉爲補碼爲:"10000000000000000000000000011110",用10進製表示:-30
五、左移
表示:<<
結果:數值所有位向左移動指定位數,用0補全移動後空位。
var num1 = 3;
var num2 = num1<<2;
console.log(num2); //12
過程:
- 3的存儲二進制碼:00000000000000000000000000000011
- 3的存儲二進制碼向左移動2位,即:000000000000000000000000000011_ _
- 移動後右側有了2個空位,用0補全,即:00000000000000000000000000001100,
- 最高位爲0,正數,用十進制表示:12
六、有符號的右移
表示:>>
結果:數值所有位向右移動指定位,保留符號位,即符號位始終在第一位不移動;符號位的值補全移動後的空位。
var num1 = -20;
var num2 = num1>>2;
console.log(num2); //-5
過程:
- -20的存儲二進制碼:"11111111111111111111111111101100"
- 向右移動2位:"1_ _11111111111111111111111111011"
- 用符號位的值補全空位,即:"11111111111111111111111111111011"
- 最高位爲1 ,即負數,所以轉爲補碼形式"10000000000000000000000000000101",十進制表示:-5
七、無符號的右移
表示:>>>
結果:操作數的32位均向右移,用0補全移動後空位。
var num1 = -20;
var num2 = num1>>>30;
console.log(num2); //3
過程:
- -20的存儲二進制碼:"11111111111111111111111111101100"
- 32位全部向右移30位:"_ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _11"
- 空位用 0 補全,即:"00000000000000000000000000000011",
- 最高位爲0,正數,用十進制表示:3