原碼反碼補(bǔ)碼為什么這么多碼?
上次我寫(xiě)了一篇文章,解釋了為什么用補(bǔ)碼的原因。可以看這里
為了簡(jiǎn)化電路設(shè)計(jì),我們需要把減法轉(zhuǎn)換為加法,怎么辦呢?就是引入補(bǔ)碼,補(bǔ)碼的計(jì)算過(guò)程中用到反碼,于是我們引入了反碼和原碼的概念。
這個(gè)就是原碼反碼補(bǔ)碼產(chǎn)生的原因和背景。
求補(bǔ)碼這是一個(gè)重點(diǎn)。
分成兩個(gè)部分,正數(shù)的補(bǔ)碼和負(fù)數(shù)的補(bǔ)碼。
正數(shù)的補(bǔ)碼就等于它的原碼,原碼怎么求呢?很簡(jiǎn)單,其實(shí)就是一個(gè)十進(jìn)制轉(zhuǎn)二進(jìn)制的過(guò)程,可以看這篇文章。
要求負(fù)數(shù)的補(bǔ)碼,必須先求負(fù)數(shù)的反碼,要求負(fù)數(shù)的反碼,必須先求負(fù)數(shù)的原碼,要求負(fù)數(shù)的原碼,必須先求對(duì)應(yīng)的正數(shù)的原碼。
下面舉一個(gè)例子,正數(shù)很簡(jiǎn)單,就拿負(fù)數(shù)來(lái)算吧。
求-45的補(bǔ)碼
求補(bǔ)碼先看是正數(shù)還是負(fù)數(shù)。這里是一個(gè)負(fù)數(shù),那么就用負(fù)數(shù)的求法。
要求-45的補(bǔ)碼,必須求-45的反碼,要求-45的反碼,必須先求-45的原碼,要求-45的原碼,必須求45的原碼。
45的原碼怎么求呢?
列出二進(jìn)制權(quán)重表
64 32 16 8 4 2 1?
很容易就得到對(duì)應(yīng)的二進(jìn)制,假設(shè)是8個(gè)二進(jìn)制位
0010 1101
把45原碼的符號(hào)位改成1,即1010 1101,這就是-45的原碼
接下來(lái)求-45的反碼
負(fù)數(shù)的反碼是在原碼的基礎(chǔ)上求得的,符號(hào)位不變,其它位都取反。
1010 1101?經(jīng)過(guò)計(jì)算就是1101 0010,這就是-45的反碼
-45的補(bǔ)碼是在反碼的基礎(chǔ)上求得的,把反碼加1即可。
最后就是1101 0010 +1=1101 0011
所以-45的補(bǔ)碼就是1101 0011
有時(shí)候還會(huì)遇到給出一個(gè)數(shù)的補(bǔ)碼,讓你求這個(gè)數(shù),這種問(wèn)題,就是求補(bǔ)碼的逆過(guò)程。
OK,假設(shè)我們現(xiàn)在知道了某個(gè)數(shù)的補(bǔ)碼是1101 0011,怎么得出它對(duì)應(yīng)的數(shù)是-45呢?
1101 0011,首先要定性一下,它是正數(shù)還是負(fù)數(shù),這里最高位是1,所以它代表的是一個(gè)負(fù)數(shù)。那負(fù)數(shù)的補(bǔ)碼是在反碼的基礎(chǔ)上加1得到的。
假設(shè)那個(gè)反碼就是abcd?efgh,即abcd?efgh+1=1101 0011
可以得到abcd?efgh=1101 0010
意思是某個(gè)負(fù)數(shù)的反碼是1101 0010,那么這個(gè)負(fù)數(shù)的原碼就是1010 1101
1010 1101?這是一個(gè)負(fù)數(shù),它對(duì)應(yīng)的正數(shù)的原碼是0010 1101,它是多少呢?
32*1+8*1+4*1+1*1=45,給它加一個(gè)符號(hào),所以原來(lái)的數(shù)就是-45