ECMAScript整數有兩種類型,有符號整數(容許用正數和負數)和無符號整數(只容許用正數)。在ECMAScript中,全部整數字面量默認都是有符號整數。優化
有符號整數,數值範圍從-2147483648到2147483647;無符號整數,數值範圍從0到4294967295。記住,全部整數字面量都默認存儲爲有符號整數,只有ECMAScript的位運算符才能建立無符號整數。code
把無符號整數轉換爲字符串,只返回有效位。也就是前面都是0的就不返回了。ip
var i = 18, j = -18; alert(i.toString(2)); // -> '10010' alert(j.toString(2)); // -> '-10010'
雖然負數的二進制顯示是在正數的二進制表示前加負號,但負數存儲也是二進制代碼,採用的形式是二進制補碼。開發
計算二進制補碼步驟有3步:字符串
- 肯定數字的非負版本的二進制表示。如,-18的補碼要先肯定18的二進制表示
- 求得二進制反碼,即把0替換爲1,把1替換爲0
- 在二進制反碼上加1
位運算符由否認好(~)表示,它是ECMAScript中爲數很少的與二進制算術有關的運算符之一。位運算符NOT是三步的處理過程:二進制
感受很麻煩,而上述操做簡單來講,能夠至關於對數字求負,而後減1,好比~25 === -26
程序
它對數字的二進制進行操做,把數字轉換爲二進制後,把每一個數字中的數位對齊,而後如下面規則進行AND運算:移動
1 對 1 -> 1
1 對 0 -> 0
0 對 1 -> 0
0 對 0 -> 0co
所以,25 & 3 = 1
block
同理AND運算符,只不過它的規則是:
1 對 1 -> 1
1 對 0 -> 1
0 對 1 -> 1
0 對 0 -> 0
所以, 25 | 3 = 27
同上理,只不過它的規則是:
1 對 1 -> 0
1 對 0 -> 1
0 對 1 -> 1
0 對 0 -> 0
所以, 25 ^ 3 = 26
移位運算通常在開發中用不到,都是用於極度優化的代碼中如驅動程序。左移運算把數字的全部數位向左移動指定的數量。在左移數位時,數字右邊多出的空位會被0填充,使結果爲完整的32位數字。注:左移操做保留數字的符號位。「符號仍然存儲在第32位中嗎?」是的。
它把32位數字中的全部數位總體右移,同時保留該數的符號。移位後會形成空位,這時空位位於數字的左側,位於符號爲的右側,ECMAScript用符號位來填充空位,建立完整的數字。
它把32位數字中的全部數位總體右移。對於正數,它與有符號右移運算是同樣的。對於負數,狀況就不一樣了。無符號右移用0填充全部空位。對於正數,這與有符號右移運算的操做徹底同樣,而負數則被做爲正數來處理。因爲無符號右移運算的結果是一個32位的正數,因此負數的無符號右移運算獲得的是一個很是大的數字。要實現這點,須要把數字轉爲無符號的等價形式(儘管這個數字仍是有符號的),能夠這樣來轉換:
var iUnsigned64 = -64 >>> 0;
而後用Number類型的toString()獲取它真正的位表示,採用的基爲2:
alert(iUnsigned64.toString(2));
結果生成 11111111111111111111111111000000,即有符號的-64的二進制補碼錶示,不過它等於無符號整數4294967232。出於這種緣由,使用無符號右移運算符時要當心。