首頁 > web前端 > js教程 > 主體

javascript中負數算術右移、邏輯右移的奧秘探索_javascript技巧

WBOY
發布: 2016-05-16 17:19:45
原創
1749 人瀏覽過

javascript中負數的算術右移和邏輯右移都十分的讓人迷惑,特別是邏輯右移>>>,你會發現即使一個很小的負數,右移之後,也會得到一個無比巨大的數,這是為什麼呢?

原來在邏輯右移中符號位會隨著整體一起往右移動,這樣就是相當於無符號數的移動了,最後得到的就是一個正數,因為符號位不存在了。首先邏輯右移產生的一定是32位的數,然後負數的符號位為1,這意味著從第32位到符號位的位置全部由1填充,這樣的數能不大嗎例如-1,邏輯右移0位表現形式就是1111 1111 1111 1111 1111 1111 1111 1111 ,這樣的數是當作正數來對待的!所以將-1邏輯右移N位,最後的結果都是全為1!

左移運算保留數字的符號位。例如,如果把 -2 左移 5 位,得到的是 -64,而不是 64。 「符號仍然儲存在第 32 位元中嗎?」是的,不過這在 ECMAScript 後台進行,開發者不能直接存取第 32 個數字。即使輸出二進位字串形式的負數,顯示的也是負號形式(例如,-2 將顯示-10。)

有符號右移運算

有符號右移運算子由兩個大於號表示(
var iOld = 64; //等於二進位1000000
var iNew = iOld >> 5; //等於二進位10 十進位2同樣,移動數位後會造成空位。這次,空位位於數字的左側,但位於符號位之後。 ECMAScript 以符號位的值填滿這些空位,建立完整的數字,如下圖所示:

無符號右移運算

無符號右移運算子由三個大於號(>>>)表示,它將無符號32 位數的所有數字整體右移。對於正數,無符號右移運算的結果與有符號右移運算一樣。

用有符號右移運算中的例子,把 64 右移 5 位,將變成 2:

無符號右移運算用 0 填滿所有空位。對於正數,這與有符號右移運算的運算一樣,而負數則被當作正數來處理。

由於無符號右移運算的結果是一個 32 位元的正數,所以負數的無符號右移運算得到的總是一個非常大的數字。例如,如果把 -64 右移 5 位,將得到 134217726。如果得到這種結果的呢?

要實現這一點,需要把這個數字轉換成無符號的等價形式(儘管該數字本身還是有符號的),可以通過以下代碼獲得這種形式:

var iUnsigned64 = -64 >>> 0;

然後,用Number 類型的toString() 取得它的真正的位元表示,採用的基為2:程式碼如下:

alert(iUnsigned64 .toString(2));

這將產生1111111111111111111111111000000,即有符號整數-64 的二進位補碼表示,不過它等於無符號整數4294967232。

因為這個原因,使用無符號右移運算子要小心。

現在來說一下負數的算術右移>>:

我們發現-9>>2=-3,為什麼是-3呢?

首先符號位是不變的,不參加右移,然後在9右移的過程中,最低位為1的話,那麼右移之後最低位仍然為1!這是很奇怪的。

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!