最近學(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)系:
機(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ù)
使用補(bǔ)碼可使減法變加法(符號(hào)位參與運(yùn)算)
負(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