JavaScript的位操作符

JavaScript的位操作符有:按位非,按位與,按位或,按位異或,左移,有符號的右移,無符號的右移。

基礎:

  1. ECMAScript 整數有兩種類型:有符號整數(允許用正數和負數)和無符號整數(只允許用正數)。在 ECMAScript 中,所有整數字面量默認都是有符號整數,有符號整數使用 31 位表示整數的數值,用第 32 位表示整數的符號,0 表示正數,1 表示負數。
  2. ECMAScript中正數以純二進制格式存儲,負數使用是二進制補碼的格式存儲
  3. 補碼:正數的補碼就是其本身;負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1。

 

一、按位非

表示:~

結果:操作數的所有位取反。也等於操作數的負數-1。

var num1 = 20;
var num2 = ~num1;
console.log(num2);//-21

過程:

  1. num1二進制表示爲 "00000000000000000000000000010100"
  2. num1每位取反,即"11111111111111111111111111101011"
  3. num1取反的最高位爲1,表示負數,因爲ECMAScript中負數使用是二進制補碼的格式存儲,所以求"11111111111111111111111111101011"的補碼,即"10000000000000000000000000010101"。
  4. 將"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

過程:

  1. num1二進制表示爲"00000000000000000000000000001110",
  2. num2二進制表示爲"00000000000000000000000000010100"
  3. 每位對齊相與:      "00000000000000000000000000000100",轉爲十進制爲 4。
  4. 負數是補碼格式存儲,所以 -20 的二進制表示爲:"11111111111111111111111111101100",與num1每位對齊相與,結果爲"00000000000000000000000000001100",即12

 

三、按位或

表示:|

結果:全0則0,否則爲1。

var num1 = -20;
var num2 = 14;
var num3 = num1 | num2;
console.log(num3);//-18

過程:

  1. 負數是補碼格式存儲,所以-20的存儲二進制表示爲"11111111111111111111111111101100"
  2. 14的二進制表示爲"00000000000000000000000000001110"
  3. 按位或操作,對應位有1則1。爲:11111111111111111111111111101110,最高位爲1,表示負數,負數按補碼格式存儲,所以轉爲補碼爲:10000000000000000000000000010010,用10進製表示爲 -18

 

四、按位異或

表示:^

結果:操作數的二進制對應位只有一個“1”時結果爲“1”,其餘情況爲“0”

var num1 = -20;
var num2 = 14;
var num3 = num1 ^ num2;
console.log(num3); //-30

 過程:

  1. -20:"11111111111111111111111111101100"
  2. 14:"00000000000000000000000000001110"
  3. 對應位只一個“1”則“1”,結果:"11111111111111111111111111100010"
  4. 結果最高位爲1,表示負數,負數用補碼存儲,所以轉爲補碼爲:"10000000000000000000000000011110",用10進製表示:-30

 

五、左移

表示:<<

結果:數值所有位向左移動指定位數,用0補全移動後空位。

var num1 = 3;
var num2 = num1<<2;
console.log(num2); //12

過程:

  1. 3的存儲二進制碼:00000000000000000000000000000011
  2. 3的存儲二進制碼向左移動2位,即:000000000000000000000000000011_ _
  3. 移動後右側有了2個空位,用0補全,即:00000000000000000000000000001100,
  4. 最高位爲0,正數,用十進制表示:12

 

六、有符號的右移

表示:>>

結果:數值所有位向右移動指定位,保留符號位,即符號位始終在第一位不移動;符號位的值補全移動後的空位。

var num1 = -20;
var num2 = num1>>2;
console.log(num2); //-5

過程:

  1. -20的存儲二進制碼:"11111111111111111111111111101100"
  2. 向右移動2位:"1_ _11111111111111111111111111011"
  3. 用符號位的值補全空位,即:"11111111111111111111111111111011"
  4. 最高位爲1 ,即負數,所以轉爲補碼形式"10000000000000000000000000000101",十進制表示:-5

 

七、無符號的右移

表示:>>>

結果:操作數的32位均向右移,用0補全移動後空位。

var num1 = -20;
var num2 = num1>>>30;
console.log(num2); //3

過程:

  1. -20的存儲二進制碼:"11111111111111111111111111101100"
  2. 32位全部向右移30位:"_ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _11"
  3. 空位用 0 補全,即:"00000000000000000000000000000011",
  4. 最高位爲0,正數,用十進制表示:3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章