最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

[補(bǔ)檔]bilibili播放器特殊彈幕語言-ECMAScript 位運(yùn)算符

2023-02-24 16:32 作者:初代目蔥娘  | 我要投稿

標(biāo)題:ECMAScript 位運(yùn)算符

轉(zhuǎn)自:docs.bilibili.tv

位運(yùn)算符是在數(shù)字底層(即表示數(shù)字的32 個(gè)數(shù)位)進(jìn)行操作的。

目錄

1 重溫整數(shù)

2 位運(yùn)算NOT

3 位運(yùn)算AND

4 位運(yùn)算OR

5 位運(yùn)算XOR

6 左移運(yùn)算

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

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

重溫整數(shù)

ECMAScript 整數(shù)有兩種類型,即有符號(hào)整數(shù)(允許用正數(shù)和負(fù)數(shù))和無符號(hào)整數(shù)(只允許用正數(shù))。在ECMAScript 中,所有整數(shù)字面量默認(rèn)都是有符號(hào)整數(shù),這意味著什么呢?

有符號(hào)整數(shù)使用31 位表示整數(shù)的數(shù)值,用第32 位表示整數(shù)的符號(hào),0 表示正數(shù),1 表示負(fù)數(shù)。數(shù)值范圍從-2147483648 到2147483647。

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

18 的二進(jìn)制版本只用了前5 位,它們是這個(gè)數(shù)字的有效位。把數(shù)字轉(zhuǎn)換成二進(jìn)制字符串,就能看到有效位:

這段代碼只輸出"10010",而不是18 的32 位表示。其他的數(shù)位并不重要,因?yàn)閮H使用前5 位即可確定這個(gè)十進(jìn)制數(shù)值。如下圖所示:

負(fù)數(shù)也存儲(chǔ)為二進(jìn)制代碼,不過采用的形式是二進(jìn)制補(bǔ)碼。計(jì)算數(shù)字二進(jìn)制補(bǔ)碼的步驟有三步:

  1. 確定該數(shù)字的非負(fù)版本的二進(jìn)制表示(例如,要計(jì)算-18的二進(jìn)制補(bǔ)碼,首先要確定18 的二進(jìn)制表示)

  2. 求得二進(jìn)制反碼,即要把0 替換為1,把1 替換為 0

  3. 在二進(jìn)制反碼上加 1

要確定-18 的二進(jìn)制表示,首先必須得到18 的二進(jìn)制表示,如下所示:

接下來,計(jì)算二進(jìn)制反碼,如下所示:

最后,在二進(jìn)制反碼上加1,如下所示:

因此,-18 的二進(jìn)制表示即1111 1111 1111 1111 1111 1111 1110 1110。記住,在處理有符號(hào)整數(shù)時(shí),開發(fā)者不能訪問31 位。

有趣的是,把負(fù)整數(shù)轉(zhuǎn)換成二進(jìn)制字符串后,ECMAScript 并不以二進(jìn)制補(bǔ)碼的形式顯示,而是用數(shù)字絕對(duì)值的標(biāo)準(zhǔn)二進(jìn)制代碼前面加負(fù)號(hào)的形式輸出。例如:

這段代碼輸出的是"-10010",而非二進(jìn)制補(bǔ)碼,這是為避免訪問位31。為了簡(jiǎn)便,ECMAScript 用一種簡(jiǎn)單的方式處理整數(shù),使得開發(fā)者不必關(guān)心它們的用法。

另一方面,無符號(hào)整數(shù)把最后一位作為另一個(gè)數(shù)位處理。在這種模式中,第32位不表示數(shù)字的符號(hào),而是值2 31。由于這個(gè)額外的位,無符號(hào)整數(shù)的數(shù)值范圍為0到4294967295。對(duì)于小于2147483647的整數(shù)來說,無符號(hào)整數(shù)看來與有符號(hào)整數(shù)一樣,而大于2147483647的整數(shù)則要使用位31(在有符號(hào)整數(shù)中,這一位總是0)。

把無符號(hào)整數(shù)轉(zhuǎn)換成字符串后,只返回它們的有效位。

注意:所有整數(shù)字面量都默認(rèn)存儲(chǔ)為有符號(hào)整數(shù)。只有ECMAScript的位運(yùn)算符才能創(chuàng)建無符號(hào)整數(shù)。

位運(yùn)算NOT

位運(yùn)算NOT 由否定號(hào)(~)表示,它是ECMAScript 中為數(shù)不多的與二進(jìn)制算術(shù)有關(guān)的運(yùn)算符之一。

位運(yùn)算NOT 是三步的處理過程:

  1. 把運(yùn)算數(shù)轉(zhuǎn)換成32 位數(shù)字

  2. 把二進(jìn)制數(shù)轉(zhuǎn)換成它的二進(jìn)制反碼

  3. 把二進(jìn)制數(shù)轉(zhuǎn)換成浮點(diǎn)數(shù)

例如:

位運(yùn)算NOT 實(shí)質(zhì)上是對(duì)數(shù)字求負(fù),然后減1,因此25 變-26。用下面的方法也可以得到同樣的方法:

位運(yùn)算AND

位運(yùn)算AND 由和號(hào)(&)表示,直接對(duì)數(shù)字的二進(jìn)制形式進(jìn)行運(yùn)算。它把每個(gè)數(shù)字中的數(shù)位對(duì)齊,然后用下面的規(guī)則對(duì)同一位置上的兩個(gè)數(shù)位進(jìn)行AND 運(yùn)算:

例如,要對(duì)數(shù)字25 和3 進(jìn)行AND 運(yùn)算,代碼如下所示:

25 和3 進(jìn)行AND 運(yùn)算的結(jié)果是1。為什么?分析如下:

可以看出,在25 和3 中,只有一個(gè)數(shù)位(位0)存放的都是1,因此,其他數(shù)位生成的都是0,所以結(jié)果為1。

位運(yùn)算OR

位運(yùn)算OR 由符號(hào)(|)表示,也是直接對(duì)數(shù)字的二進(jìn)制形式進(jìn)行運(yùn)算。在計(jì)算每位時(shí),OR 運(yùn)算符采用下列規(guī)則:

第一個(gè)數(shù)字中的數(shù)位第二個(gè)數(shù)字中的數(shù)位結(jié)果111101011000

仍然使用AND 運(yùn)算符所用的例子,對(duì)25 和3 進(jìn)行OR 運(yùn)算,代碼如下:

25 和3 進(jìn)行OR 運(yùn)算的結(jié)果是27:

可以看出,在兩個(gè)數(shù)字中,共有4 個(gè)數(shù)位存放的是1,這些數(shù)位被傳遞給結(jié)果。二進(jìn)制代碼11011 等于27。

位運(yùn)算XOR

位運(yùn)算XOR 由符號(hào)(^)表示,當(dāng)然,也是直接對(duì)二進(jìn)制形式進(jìn)行運(yùn)算。XOR 不同于OR,當(dāng)只有一個(gè)數(shù)位存放的是1 時(shí),它才返回1。真值表如下:

對(duì)25 和3 進(jìn)行XOR 運(yùn)算,代碼如下:

25 和3 進(jìn)行XOR 運(yùn)算的結(jié)果是26:

可以看出,在兩個(gè)數(shù)字中,共有4 個(gè)數(shù)位存放的是1,這些數(shù)位被傳遞給結(jié)果。二進(jìn)制代碼11010 等于26。

左移運(yùn)算

左移運(yùn)算由兩個(gè)小于號(hào)表示(<<)。它把數(shù)字中的所有數(shù)位向左移動(dòng)指定的數(shù)量。例如,把數(shù)字2(等于二進(jìn)制中的10)左移5 位,結(jié)果為64(等于二進(jìn)制中的1000000):

注意:在左移數(shù)位時(shí),數(shù)字右邊多出5個(gè)空位。左移運(yùn)算用0填充這些空位,使結(jié)果成為完整的32位數(shù)字。

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

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

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

同樣,移動(dòng)數(shù)位后會(huì)造成空位。這次,空位位于數(shù)字的左側(cè),但位于符號(hào)位之后。ECMAScript 用符號(hào)位的值填充這些空位,創(chuàng)建完整的數(shù)字,如下圖所示:

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

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

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

對(duì)于負(fù)數(shù),情況就不同了。

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

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

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

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

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

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


[補(bǔ)檔]bilibili播放器特殊彈幕語言-ECMAScript 位運(yùn)算符的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
湄潭县| 怀安县| 泌阳县| 方山县| 汤原县| 闽清县| 穆棱市| 大兴区| 加查县| 龙川县| 龙海市| 武邑县| 彭水| 剑川县| 江油市| 霞浦县| 固阳县| 双柏县| 奎屯市| 鹤峰县| 二连浩特市| 长春市| 富民县| 农安县| 鹤庆县| 天柱县| 南和县| 罗田县| 屯门区| 政和县| 简阳市| 扎鲁特旗| 泽库县| 大安市| 黑水县| 察哈| 肇源县| 封丘县| 巴塘县| 蓝田县| 台东市|