javascript 二進(jìn)制運(yùn)算技巧解析
2024-05-06 14:20:53
供稿:網(wǎng)友
1、原碼、反碼、補(bǔ)碼,正數(shù)減法轉(zhuǎn)補(bǔ)碼加法
js 在進(jìn)行二進(jìn)制運(yùn)算時(shí),使用 32 位二進(jìn)制整數(shù),由于 js 的整數(shù)都是有符號數(shù),最高位0表示正數(shù),1表示負(fù)數(shù),因此,js 二進(jìn)制運(yùn)算中使用的整數(shù)表達(dá)范圍是
代碼如下:
-Math.pow(2,31) ~ Math.pow(2,31)-1 // -2147483648 ~ 2147483647
原碼:最高位 0 表示正,1表示負(fù),其余 31 位是該數(shù)的絕對值(真值的絕對值)的二進(jìn)制形式
反碼:正數(shù)反碼與原碼相同,負(fù)數(shù)反碼是原碼符號位不變,其余31位取反(0變1,1變0)
補(bǔ)碼:正數(shù)補(bǔ)碼與原碼相同,負(fù)數(shù)補(bǔ)碼為反碼加 1 (符號位參與運(yùn)算,其實(shí)只有求 -0 的補(bǔ)碼才涉及最高位進(jìn)位,因此不用擔(dān)心在反碼加1時(shí)由于符號位參與運(yùn)算進(jìn)位而使 - 變 +)。
+0 的反碼:32個(gè)0 ,按正數(shù)處理,原碼、反碼、補(bǔ)碼都是0。
-0 的反碼:最高位1,其余位由 +0 原碼取反,得到 32 個(gè) 1
-0 的補(bǔ)碼:其反碼是 32 個(gè) 1 加 1,最高位溢出被舍棄,得到 32 個(gè)0
因此,正負(fù) 0 的補(bǔ)碼都是 0.
由負(fù)數(shù)的補(bǔ)碼求他的絕對值補(bǔ)碼:負(fù)二進(jìn)制數(shù)的絕對值,只要各位(包括符號位)取反,再加1,就得到其絕對值。
計(jì)算機(jī)在處理加減運(yùn)算時(shí),使用補(bǔ)碼進(jìn)行運(yùn)算,減法被視為加上一個(gè)負(fù)數(shù),在處理負(fù)數(shù)時(shí),用負(fù)數(shù)的補(bǔ)碼進(jìn)行加法可以即可得到正確運(yùn)算結(jié)果,補(bǔ)碼是為了統(tǒng)一加減運(yùn)算而生的。
正數(shù)減法轉(zhuǎn)補(bǔ)碼加法的原理是 32 位數(shù)溢出:
對于32 位二進(jìn)制正整數(shù)來說,其模為
代碼如下:
Math.pow(2,32) = 4294967296
32 位正整數(shù)最大表達(dá)范圍是 4294967296 - 1 ,達(dá)到 4294967296 這個(gè)值就要進(jìn)位到33位,33 位是溢出位被丟棄,只得到32 個(gè)0(這個(gè)道理跟表盤上 0 點(diǎn) 和12 點(diǎn)的時(shí)針指在同一個(gè)位置是一樣的,表盤以 12 為模),因此,一個(gè)數(shù)逐漸增大,一旦超出 4294967296-1 的數(shù) M 就可以表示為 M%4294967296
而負(fù)數(shù) -M (M為絕對值)可以表示為一個(gè)正數(shù): 4294967296 - M(這個(gè)正數(shù)就是負(fù)數(shù)的補(bǔ)碼對應(yīng)的二進(jìn)制正整數(shù),負(fù)數(shù)的補(bǔ)碼按32位二進(jìn)制數(shù),與他的原碼相加剛好等于模 ),道理跟表盤一樣,11點(diǎn)和負(fù)1點(diǎn)指在同一個(gè)位置。
以 -3 為例:
代碼如下:
(Array(32).join("0")+(3).toString(2)).slice(-32); // |-3| 的二進(jìn)制數(shù),即原碼
原碼 = 00000000000000000000000000000011;
反碼 = 11111111111111111111111111111100; //原碼符號位為1,其余位取反
補(bǔ)碼 = 11111111111111111111111111111101; //反碼加1因?yàn)榉创a由正數(shù)形式的原碼低31位取反得到,因此這兩個(gè)數(shù)的低31位全都是1,加上反碼符號位1,得到32 個(gè)1
那么,有
補(bǔ)碼+原碼 = (反碼+1)+原碼
= (反碼+原碼)+1
= 1+(32位全是 1 的二進(jìn)制數(shù)) //因?yàn)榉创a由正數(shù)形式的原碼的低31位取反加上符號位1得到,因此這兩個(gè)數(shù)的和的低31位全都是1,加上反碼符號位1,得到32 個(gè)1