計(jì)算機(jī)基礎(chǔ)二進(jìn)制補(bǔ)碼與移位運(yùn)算

最近學(xué)習(xí)C,感覺C確實(shí)比較接近底層,要多了解計(jì)算機(jī)基礎(chǔ),這一門語(yǔ)言就一定不能錯(cuò)過了,因?yàn)樵S多知識(shí)都從這里延伸出來(lái)。
言歸正題,先說說機(jī)器數(shù):

二進(jìn)制數(shù)有正負(fù)之分,如N1=+0.101101,N2=-0.101101,則N1是個(gè)正數(shù),N2是個(gè)負(fù)數(shù)。機(jī)器不能直接把符號(hào)“+”、“-”表示出來(lái),為了能在計(jì)算機(jī)中表示正負(fù)數(shù),必須引入符號(hào)位,即把正負(fù)符號(hào)也用1位二進(jìn)制數(shù)碼來(lái)表示。把符號(hào)位和數(shù)值位一起編碼來(lái)表示相應(yīng)的數(shù)的表示方法包括:原碼、補(bǔ)碼、反碼、移碼等。

機(jī)器數(shù) 用二進(jìn)制數(shù)“0”或“1”來(lái)表示數(shù)的符號(hào),“0”表示正號(hào),“1”表示負(fù)號(hào),且把符號(hào)位置于該數(shù)的最高數(shù)值位之前,這樣表示的數(shù)稱為機(jī)器數(shù)(或稱機(jī)器碼),即把符號(hào)位和數(shù)值位一起編碼來(lái)表示的數(shù)就是機(jī)器數(shù)。

原碼/補(bǔ)碼/反碼之間的關(guān)系:

原碼 反碼 補(bǔ)碼.PNG

機(jī)器數(shù):原碼與補(bǔ)碼
對(duì)于正數(shù)而言,二進(jìn)制數(shù)的原碼/反碼/補(bǔ)碼都是一樣的
對(duì)于負(fù)數(shù)而言,其二進(jìn)制數(shù)與原碼一樣,其反碼則是其二進(jìn)制數(shù)逐位反轉(zhuǎn)(0轉(zhuǎn)為1,1轉(zhuǎn)為0)而成,其補(bǔ)碼則是反碼的基礎(chǔ)上加1
其中對(duì)于原碼/反碼和補(bǔ)碼而言,其最高位中0代表正數(shù),1代表負(fù)數(shù)

表示規(guī)則.PNG

使用補(bǔ)碼可使減法變加法(符號(hào)位參與運(yùn)算)

補(bǔ)碼運(yùn)算.PNG

負(fù)數(shù)的原碼和補(bǔ)碼之間的轉(zhuǎn)換

負(fù)數(shù)的原碼=負(fù)數(shù)的補(bǔ)碼-1 再取反

負(fù)數(shù)的原碼=負(fù)數(shù)的補(bǔ)碼取反再加1

更多的知識(shí)可以參考這篇文章:
http://share.onlinesjtu.com/mod/tab/view.PHP?id=173

位移運(yùn)算

說到位移運(yùn)算,就必須有與、或、非、異或這幾個(gè)運(yùn)算符,它們二進(jìn)制運(yùn)算中的運(yùn)算符,以下時(shí)他們的規(guī)則:

&   與運(yùn)算,有0為0,全1為1;

|   或運(yùn)算,有1為1,全0為0;

!   非運(yùn)算,非0則1,非1則0;

^   異或運(yùn)算,相同為0,不同為1;

~ 二進(jìn)制反碼或按位取反運(yùn)算符,把1變?yōu)?, 0變?yōu)?

& 與運(yùn)算

就像規(guī)則一樣,只有全部時(shí)1的時(shí)候得到的結(jié)果才為1。
示例:
(10010011)&(00111101)=(00010001)

| 或運(yùn)算

當(dāng)運(yùn)算結(jié)果其中一個(gè)為1時(shí),結(jié)果就為1,當(dāng)然,都是1的時(shí)候也是1
示例:
(10010011)&(00111101)=(10111111)

^ 異或運(yùn)算

當(dāng)且僅當(dāng)有一個(gè)1的時(shí)候才為1,也就是說只有1和0組合才為1
示例:
(10010011)&(00111101)=(10101110)

~ 取反運(yùn)算符

將二進(jìn)制逐位取反
示例:
~(10011010) = (01100101)

用法

了解這四個(gè)運(yùn)算符很簡(jiǎn)單,但是對(duì)于初學(xué)者而言,更重要的是其用法,如果不知道怎么用,那么這道這些運(yùn)算符也沒什么用

& 運(yùn)算符用法:掩碼

與運(yùn)算符通常用于掩碼,指的是一些設(shè)置為開(1)或管(0)的為組合。
在實(shí)際運(yùn)用中,最常見的掩碼用法莫過于以下這種:

ch & 0xff

其中0xff的二進(jìn)制形式為11111111,當(dāng)一個(gè)數(shù)與上0xff,那么此數(shù)的最后8位將保存不變(&運(yùn)算規(guī)則決定),而其他數(shù)均會(huì)為0,也就是說最終的值被改為1個(gè)8為字節(jié),這種用法是取位的某一段。

第二種用法是讓某些位或某一位為0,因?yàn)?amp;運(yùn)算的規(guī)則,只要給某些位上&上為0的數(shù),那么這一位就會(huì)為0,如上面的示例(10010011)&(00111101)=(00010001)

| 運(yùn)算符用法

使一個(gè)位或幾個(gè)位為1,如x|0x01,這樣不管x是什么數(shù),其結(jié)果的最后一位都會(huì)為1。
把兩個(gè)數(shù)拼起來(lái),如0xFF00 | 0x00FF

~ 取反用法

想得到全部位為1的數(shù),如~0

移位運(yùn)算

移位運(yùn)算分<<左移和>> 右移。

其中<<左移的結(jié)果將會(huì)乘以2的n次冪,其中左移末端位的值丟失時(shí),用0補(bǔ)足

>>右移的結(jié)果將會(huì)除以2的n次冪,移出右末端位的值丟棄。unsigned類型,左側(cè)填0;signed類型,左側(cè)保持不變(保持符號(hào)),如10000000>>1 = 11000000
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 網(wǎng)站亂碼問題我們會(huì)經(jīng)常碰到,大多見于非英文的中文字符或其他字符亂碼,而且,這類問題常常是因?yàn)榫幋a方式問題,主要原因...
    波段頂?shù)?/span>閱讀 2,957評(píng)論 1 9
  • 一、概要 1、數(shù)據(jù)的表示:數(shù)制及其轉(zhuǎn)換、原碼、反碼、補(bǔ)碼、移碼、浮點(diǎn)數(shù)、溢出、算...
    _Jason___閱讀 3,206評(píng)論 0 5
  • 如果能回到過去 該怎么跟從前的自己解釋 說自己是怎樣走過這些年并如何變成現(xiàn)在的這個(gè)樣子 肯定不受自己喜歡 會(huì)被抱怨...
    王夏天閱讀 284評(píng)論 0 1
  • 童年的美好記憶,總是與當(dāng)下的困苦、后悔、遲疑纏在一起,讓我們變得復(fù)雜。
    周淡皮閱讀 171評(píng)論 0 0