js左移運算子 ECMAScript 位運算子

2021-10-13 04:03:54 字數 1607 閱讀 3716

重溫整數

ecmascript 整數有兩種型別,即有符號整數(允許用正數和負數)和無符號整數(只允許用正數)。在 ecmascript 中,所有整數字面量預設都是有符號整數,這意味著什麼呢?

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

可以以兩種不同的方式儲存二進位制形式的有符號整數,一種用於儲存正數,一種用於儲存負數。正數是以真二進位制形式儲存的,前 31 位中的每一位都表示 2 的冪,從第 1 位(位 0)開始,表示 20,第 2 位(位 1)表示 21。沒用到的位用 0 填充,即忽略不計。例如,下圖展示的是數 18 的表示法。

18 的二進位制版本只用了前 5 位,它們是這個數字的有效位。把數字轉換成二進位制字串,就能看到有效位:

var inum = 18;

alert(inum.tostring(2));//輸出 "10010"

這段**只輸出 "10010",而不是 18 的 32 位表示。其他的數字並不重要,因為僅使用前 5 位即可確定這個十進位制數值。如下圖所示:

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

確定該數字的非負版本的二進位制表示(例如,要計算 -18的二進位制補碼,首先要確定 18 的二進位制表示)

求得二進位制反碼,即要把 0 替換為 1,把 1 替換為 0

在二進位制反碼上加 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

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 用一種簡單的方式處理整數,使得開發者不必關心它們的用法。

另一方面,無符號整數把最後一位作為另乙個數字處理。在這種模式中,第 32 位不表示數字的符號,而是值 231。由於這個額外的位,無符號整數的數值範圍為 0 到 4294967295。對於小於 2147483647 的整數來說,無符號整數看來與有符號整數一樣,而大於 2147483647 的整數則要使用位 31(在有符號整數中,這一位總是 0)。

把無符號整數轉換成字串後,只返回它們的有效位。

注意:所有整數字面量都預設儲存為有符號整數。只有 ecmascript 的位運算子才能建立無符號整數。

左移運算子

左移運算子 表示將乙個數的二進位制值向左移動指定的位數,尾部補0,即乘以2的指定次方 最高位即符號位不參與移動 4 的二進位制形式為100,左移一位為1000 即十進位制的8 相當於乘以2的1次方 4 1 8 4 1 8上面 中,4左移一位得到 8,是因為 4的二進位制形式是111111111111...

左移運算子和右移運算子

左移操作 規則 右邊空出的位用0填補 高位左移溢位則捨棄該高位。例如 10 的二進位制為 0000 1010 那麼10左移3為就是 0101 0000,結果就是80.10 3 80 右移操作 規則 左邊空出的位用0或者1填補。正數用0填補,負數用1填補。注 不同的環境填補方式可能不同 低位右移溢位則...

左移運算子過載

1.作用 可以輸出自定義資料型別,比如輸出乙個類物件。includeusing namespace std include 左移 運算子過載 class person private 加入利用成員函式過載左移運算子 p.operator cout 簡化版本 p void operator cout ...