国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

javascript中負(fù)數(shù)算術(shù)右移、邏輯右移的奧秘探索

2024-05-06 15:53:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
javascript中負(fù)數(shù)的算術(shù)右移和邏輯右移都十分的讓人迷惑,特別是邏輯右移,接下來(lái)的文章中將為大家詳細(xì)介紹下為什么右移之后,一個(gè)很小的負(fù)數(shù)也會(huì)得到一個(gè)無(wú)比巨大的數(shù)

javascript中負(fù)數(shù)的算術(shù)右移和邏輯右移都十分的讓人迷惑,特別是邏輯右移>>>,你會(huì)發(fā)現(xiàn)即使一個(gè)很小的負(fù)數(shù),右移之后,也會(huì)得到一個(gè)無(wú)比巨大的數(shù),這是為什么呢?

原來(lái)在邏輯右移中符號(hào)位會(huì)隨著整體一起往右移動(dòng),這樣就是相當(dāng)于無(wú)符號(hào)數(shù)的移動(dòng)了,最后得到的就是一個(gè)正數(shù),因?yàn)榉?hào)位不存在了。首先邏輯右移產(chǎn)生的一定是32位的數(shù),然后負(fù)數(shù)的符號(hào)位為1,這意味著從第32位到符號(hào)位的位置全部由1填充,這樣的數(shù)能不大嗎例如-1,邏輯右移0位表現(xiàn)形式就是1111 1111 1111 1111 1111 1111 1111 1111 ,這樣的數(shù)是當(dāng)作正數(shù)來(lái)對(duì)待的!所以將-1邏輯右移N位,最后的結(jié)果都是全為1!

左移運(yùn)算保留數(shù)字的符號(hào)位。例如,如果把 -2 左移 5 位,得到的是 -64,而不是 64。“符號(hào)仍然存儲(chǔ)在第 32 位中嗎?”是的,不過(guò)這在 ECMAScript 后臺(tái)進(jìn)行,開(kāi)發(fā)者不能直接訪問(wèn)第 32 個(gè)數(shù)位。即使輸出二進(jìn)制字符串形式的負(fù)數(shù),顯示的也是負(fù)號(hào)形式(例如,-2 將顯示 -10。)

有符號(hào)右移運(yùn)算

有符號(hào)右移運(yùn)算符由兩個(gè)大于號(hào)表示(<$lt;)。它把 32 位數(shù)字中的所有數(shù)位整體右移,同時(shí)保留該數(shù)的符號(hào)(正號(hào)或負(fù)號(hào))。有符號(hào)右移運(yùn)算符恰好與左移運(yùn)算相反。例如,把 64 右移 5 位,將變?yōu)?2:

var iOld = 64; //等于二進(jìn)制 1000000
var iNew = iOld >> 5; //等于二進(jìn)制 10 十進(jìn)制 2同樣,移動(dòng)數(shù)位后會(huì)造成空位。這次,空位位于數(shù)字的左側(cè),但位于符號(hào)位之后。ECMAScript 用符號(hào)位的值填充這些空位,創(chuàng)建完整的數(shù)字,如下圖所示:

無(wú)符號(hào)右移運(yùn)算

無(wú)符號(hào)右移運(yùn)算符由三個(gè)大于號(hào)(>>>)表示,它將無(wú)符號(hào) 32 位數(shù)的所有數(shù)位整體右移。對(duì)于正數(shù),無(wú)符號(hào)右移運(yùn)算的結(jié)果與有符號(hào)右移運(yùn)算一樣。

用有符號(hào)右移運(yùn)算中的例子,把 64 右移 5 位,將變?yōu)?2:

無(wú)符號(hào)右移運(yùn)算用 0 填充所有空位。對(duì)于正數(shù),這與有符號(hào)右移運(yùn)算的操作一樣,而負(fù)數(shù)則被作為正數(shù)來(lái)處理。

由于無(wú)符號(hào)右移運(yùn)算的結(jié)果是一個(gè) 32 位的正數(shù),所以負(fù)數(shù)的無(wú)符號(hào)右移運(yùn)算得到的總是一個(gè)非常大的數(shù)字。例如,如果把 -64 右移 5 位,將得到 134217726。如果得到這種結(jié)果的呢?

要實(shí)現(xiàn)這一點(diǎn),需要把這個(gè)數(shù)字轉(zhuǎn)換成無(wú)符號(hào)的等價(jià)形式(盡管該數(shù)字本身還是有符號(hào)的),可以通過(guò)以下代碼獲得這種形式:

var iUnsigned64 = -64 >>> 0;

然后,用 Number 類型的 toString() 獲取它的真正的位表示,采用的基為 2:代碼如下:

alert(iUnsigned64.toString(2));

這將生成 11111111111111111111111111000000,即有符號(hào)整數(shù) -64 的二進(jìn)制補(bǔ)碼表示,不過(guò)它等于無(wú)符號(hào)整數(shù) 4294967232。

出于這種原因,使用無(wú)符號(hào)右移運(yùn)算符要小心。

現(xiàn)在來(lái)說(shuō)一下負(fù)數(shù)的算術(shù)右移>>:

我們發(fā)現(xiàn)-9>>2=-3,為什么是-3呢?

首先符號(hào)位是不變的,不參加右移,然后在9右移的過(guò)程中,最低位為1的話,那么右移之后最低位仍然為1!這是很奇怪的。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 德保县| 尼勒克县| 准格尔旗| 松原市| 无极县| 无棣县| 巍山| 宽城| 扶绥县| 法库县| 丰顺县| 太保市| 梁山县| 名山县| 紫云| 闽清县| 西和县| 右玉县| 建湖县| 宁海县| 瑞安市| 和硕县| 屏山县| 宾阳县| 长春市| 名山县| 锡林浩特市| 平顶山市| 布拖县| 横山县| 临朐县| 乐昌市| 区。| 武安市| 屏山县| 饶河县| 黄骅市| 济南市| 梓潼县| 屏南县| 墨竹工卡县|