1、左移運算
左移運算由兩個小於符號表示(<<)。它把數字鐘的所有數位向左移動指定的數量。例如,把數字2左移5位沒結果為64(等於二進位中的1000000)。
var iOld = 2; //二進位位10
var iNew = iOld << 5; //二進位位1000000 等於 64
注意,在左移數位時,數字右邊多出5個空位。左移運算用0填充這些空位,使結果為完整的32位元字。
左移操作保留數位符號位。例如,如果把-2左移5位,得到的是-64,而不是64。需要注意的是,符號(二進位中的第32位)仍然儲存在第32位中。上面代碼2的左移詳解如下:
0000 0000 0000 0000 0000 0000 0000 0010 = 2
0000 0000 0000 0000 0000 0000 0100 0000 左移5位(空白處由0補充) = 64
2、有符號右移運算
有符號右移運算子由兩個大於符號(>>)表示,它把32位元字中的所有數位整體右移,同時保留該數位符號(正號或負號)。有符號右移運算恰好與左移運算相反。例如,把64右移5位,將變為2:
var iOld = 64; //二進位為:1000000
var iNew = iOld >> 5; //二進位為:10 ,結果為2
同樣,移動數位後會造成空位。空位位於數位左側,但位於符號位(二進位的第32位)之後。空位使用符號位填充:(就是說如果二進位第32位是1,那麼空位都由1填充,反之雷同。)
0000 0000 0000 0000 0000 0000 0100 0000 = 64
0000 0000 0000 0000 0000 0000 0000 0010 = 2
3、無符號右移運算
無符號右移由三個大於符號(>>>)表示,它將把無符號 32位元中的所有數位整體右移。對於整數,無符號右移運算的記過與有符號由於運算一樣。用有符號右移運算的中例子,把64右移5位,將變為2。對於負數, 情況就不同了。無符號右移運算用0填充所有空位。對於整數,這與有符號右移運算的操作完全一樣,而負數則被作為整數來處理。由於無符號右移運算的記過是一 個32位的正數,所以負數的無符號右移運算得到的總是一個非常大的數字,例如把-64右移5位,其結果為134217726。
要實現這一點,需要把這個數字轉換成無符號的等價形式(儘管該數字是有符號或有負號的),可以通過以下代碼獲得這種形式:
var iUnsigned64 = -64 >>> 0;
然後,用Number類型的toString()方法擷取它的真正的位表示,採用的基數為2: alert(iUnsigned64.toString(2));
這將產生:1111 1111 1111 1111 1111 1111 1100 0000,既有符號整數-64的二進位補碼錶示,不過它等於不帶正負號的整數4294967232.處於這種原因,使用無符號右移運算子要小心。
原文地址: http://blog.csdn.net/aerchi/article/details/23163119
本文禁止採集。
作者地址:http://www.aerchi.com