js 二進制位運算符

1、引用

ECMAScript 整數有兩種類型,即有符號整數(允許用正數和負數)和無符號整數(只允許用正數)。在 ECMAScript 中,所有整數字面量默認都是有符號整數,這意味着什麼呢?

有符號整數使用 31 位表示整數的數值,用第 32 位表示整數的符號,0 表示正數,1 表示負數。數值範圍從 -2147483648 到 2147483647。-2147483648是補碼10000000000000000000000,即-0

二進制使用有符號整數保存數據

負數也存儲爲二進制代碼,不過採用的形式是二進制補碼。計算數字二進制補碼的步驟有三步:

  1. 確定該數字的非負版本的二進制表示(例如,要計算 -18的二進制補碼,首先要確定 18 的二進制表示)
  2. 求得二進制反碼,即要把 0 替換爲 1,把 1 替換爲 0
  3. 在二進制反碼上加 1

要確定 -18 的二進制表示,首先必須得到 18 的二進制表示,如下所示:

0000 0000 0000 0000 0000 0000 0001 0010

接下來,計算二進制反碼,如下所示:

1111 1111 1111 1111 1111 1111 1110 1101

最後,在二進制反碼上加 1,如下所示:

1111 1111 1111 1111 1111 1111 1110 1101
                                      1
---------------------------------------
1111 1111 1111 1111 1111 1111 1110 1110

因此,-18 的二進制表示即 1111 1111 1111 1111 1111 1111 1110 1110。記住,在處理有符號整數時,開發者不能訪問 31 位。

有趣的是,把負整數轉換成二進制字符串後,ECMAScript 並不以二進制補碼的形式顯示,而是用數字絕對值的標準二進制代碼前面加負號的形式輸出。例如:

var iNum = -18;
alert(iNum.toString(2));	//輸出 "-10010"

這段代碼輸出的是 "-10010",而非二進制補碼,這是爲避免訪問位 31。爲了簡便,ECMAScript 用一種簡單的方式處理整數,使得開發者不必關心它們的用法。

2、含義

運算符 名稱 描述
& AND 如果兩位都是 1 則設置每位爲 1
| OR 如果兩位之一爲 1 則設置每位爲 1
^ XOR 如果兩位只有一位爲 1 則設置每位爲 1
~ NOT 反轉所有位
<< 零填充左位移 通過從右推入零向左位移,並使最左邊的位脫落。
>> 有符號右位移 通過從左推入最左位的拷貝來向右位移,並使最右邊的位脫落。
>>> 零填充右位移 通過從左推入零來向右位移,並使最右邊的位脫落。

 

3、需要注意的地方

  • 當數值不在-2147483648 到 2147483647區間時,會溢出覆蓋符號位
  • 對負數進行操作是,需先轉成補碼;比如:~-1,-1補碼等於:32個1
  • 符號位是1的代表着補碼,轉成二進制數的方法:減1,再取反,加上負號;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章