帶著問(wèn)題學(xué)習(xí)(二進(jìn)制數(shù)據(jù))
- 32位是幾個(gè)字節(jié)兰珍?
- 01011100對(duì)應(yīng)的十進(jìn)制是多少?
- 00001111左移兩位結(jié)果是多少?有什么規(guī)律?
- 以補(bǔ)碼形式表示的8位二進(jìn)制數(shù)11111111戒悠,十進(jìn)制為多少?
- 二進(jìn)制和十進(jìn)制有什么區(qū)別舟山?
為什么要使用二進(jìn)制绸狐?
????????上圖展示了一個(gè)較為簡(jiǎn)單集成電路的實(shí)例,而電腦就是由大量的集成電路芯片組成的累盗,較為熟悉的CPU就是一個(gè)十分復(fù)雜的集成芯片寒矿。
????????上圖中的每一個(gè)管腳只有兩種狀態(tài),分別是通電和不通電幅骄,那么這兩種狀態(tài)就可以對(duì)應(yīng)二進(jìn)制中的0和1劫窒,這就是為什么電腦中需要二進(jìn)制進(jìn)行運(yùn)算。
二進(jìn)制值能表達(dá)的含義
???? ??二進(jìn)制能夠表示這么多種類(lèi)的數(shù)據(jù)格式拆座,歸根結(jié)底就是在計(jì)算機(jī)中所有的數(shù)據(jù)都是以數(shù)值的形式存儲(chǔ)的,它們唯一的區(qū)別是在解析的時(shí)候不同冠息,不同的數(shù)據(jù)格式有著不同的解析方式挪凑。
二進(jìn)制和十進(jìn)制的轉(zhuǎn)換
- 二進(jìn)制是一種計(jì)數(shù)方式
-
二進(jìn)制值不僅僅是一個(gè)數(shù)
???? ??上圖展示了一個(gè)簡(jiǎn)單的浮點(diǎn)數(shù)和二進(jìn)制數(shù)之間的轉(zhuǎn)換。
二進(jìn)制的運(yùn)算
二進(jìn)制表示負(fù)數(shù)
????????在計(jì)算機(jī)中逛艰,是如何使用二進(jìn)制表示負(fù)數(shù)呢躏碳?這就需要做一些硬性規(guī)定了,為了簡(jiǎn)單起見(jiàn)散怖,我們拿一個(gè)char類(lèi)型的數(shù)據(jù)類(lèi)型舉一個(gè)簡(jiǎn)單的例子菇绵。眾所周知,一個(gè)char類(lèi)型在計(jì)算機(jī)內(nèi)存中占據(jù)8個(gè)bit镇眷,并且它的最高bit是用來(lái)表示正負(fù)號(hào)的咬最,我們想知道-3的二進(jìn)制char類(lèi)型是什么樣子,該怎么辦呢欠动?其實(shí)很簡(jiǎn)單永乌,-3的二進(jìn)制就是+3的二進(jìn)制取反加1惑申,過(guò)程如下:
3的二進(jìn)制為:00000011
00000011取反為:11111100
11111100加1為:11111101
所以11111101就是-3的二進(jìn)制表示。
我們可以再舉一個(gè)例子翅雏,比如我們想知道-128的二進(jìn)制表示圈驼,那么根據(jù)上面的過(guò)程:
128的二進(jìn)制為:10000000
10000000取反為:01111111
01111111加1為:10000000
所以10000000就是-128的二進(jìn)制表示。
相信通過(guò)上面的兩個(gè)例子望几,您會(huì)對(duì)二進(jìn)制表示負(fù)數(shù)有一個(gè)較為深刻的了解绩脆,如果您還不是太了解,我們?cè)倥e一個(gè)簡(jiǎn)單的減法運(yùn)算橄抹,比如10-7=衙伶?,我們知道害碾,在計(jì)算機(jī)中矢劲,是沒(méi)有減法運(yùn)算的,它只有加法運(yùn)算慌随,所以我們不得不把上式改寫(xiě)為:10+(-7)=?芬沉,這樣才能被計(jì)算機(jī)直接計(jì)算。現(xiàn)在的問(wèn)題就是如何找到-7的二進(jìn)制表示阁猜,和上面的方法一樣:
7的二進(jìn)制表示為:00000111
00000111取反為:11111000
11111000加1為:11111001
所以-7的二進(jìn)制為:11111001
而10的二進(jìn)制為:00001010
所以10+(-7)=00001010+11111001得出100000011共9bit丸逸,但是我們的數(shù)據(jù)類(lèi)型是char,它只有8bit剃袍,所以不得不把最高位1舍棄黄刚,得到10+(-7)=00000011的值為3,和我們用十進(jìn)制算的結(jié)果一模一樣民效。
相信大家通過(guò)這幾個(gè)例子憔维,會(huì)對(duì)二進(jìn)制表示負(fù)數(shù)以及計(jì)算機(jī)中對(duì)減法是如何操作了吧!N沸稀业扒!
按位運(yùn)算符
????????C語(yǔ)言提供了6個(gè)位操作運(yùn)算符。這些運(yùn)算符只能作用于整型操作數(shù)舒萎,即只能作用于帶符號(hào)或者無(wú)符號(hào)的char程储、short、int臂寝、long類(lèi)型:
- & 按位與(AND)章鲤;
- | 按位或(OR);
- ^按位異或(XOR)咆贬;
- << 左移败徊;
右移;
- ~按位求反(一元運(yùn)算符)素征。
二進(jìn)制的按位與運(yùn)算符(&)
????????只有兩個(gè)位都是1的時(shí)候集嵌,這時(shí)的結(jié)果才是1萝挤,其它所有情況的結(jié)果都是0,比如:
1 & 1 的結(jié)果是:1根欧;
1 & 0 的結(jié)果是:0怜珍;
0 & 1 的結(jié)果是:0;
0 & 0 的結(jié)果是:0凤粗。
二進(jìn)制的按位或運(yùn)算符(|)
????????只有兩個(gè)位都是0的時(shí)候酥泛,這時(shí)的結(jié)果才是0,其它所有情況的結(jié)果都是1嫌拣,比如:
1 | 1 的結(jié)果是:1柔袁;
1 | 0 的結(jié)果是:1;
0 | 1 的結(jié)果是:1异逐;
0 | 0 的結(jié)果是:0捶索。
二進(jìn)制的按位異或運(yùn)算符(^)
????????只有兩個(gè)位不相等的時(shí)候,這時(shí)的結(jié)果才是1灰瞻,其它所有情況的結(jié)果都是0腥例,比如:
1 ^ 1 的結(jié)果是:0;
1 ^ 0 的結(jié)果是:1酝润;
0 ^ 1 的結(jié)果是:1燎竖;
0 ^ 0 的結(jié)果是:0。
二進(jìn)制左移
????????假如有一個(gè)char類(lèi)型的變量要销,它的值為3构回,那么它的二進(jìn)制表示為:00000011,分別左移1位疏咐、2位和3位纤掸,我們看得到的數(shù)值是多少!
00000011左移1位凳鬓,得到00000110茁肠,它的值為6;
00000011左移2位缩举,得到00001100,它的值為12匹颤;
00000011左移3位仅孩,得到00011000,它的值位24,印蓖;
從上面不難得到這樣的一個(gè)規(guī)律辽慕,就是在不溢出的情況下,左移幾位赦肃,就表示原來(lái)的數(shù)乘以2的多少次冪溅蛉。
二進(jìn)制右移
????????邏輯右移:我們把左邊全部補(bǔ)0公浪,不考慮符號(hào)位的右移稱(chēng)為邏輯右移。
????????二進(jìn)制的右移就不像二進(jìn)制左移那樣簡(jiǎn)單了船侧。我們先看一個(gè)例子欠气,還是以一個(gè)char類(lèi)型的變量為例,它的值為-128镜撩,讓它右移2位预柒,如果按照左移的規(guī)律,那么-128右移2位的值應(yīng)該是-128除以2的2次冪袁梗,即-32宜鸯。那么我們下面來(lái)右移一下看看。我們?cè)偻频挂淮?128的二進(jìn)制表示:
128的二進(jìn)制表示為:10000000(這里我們先不考慮最高位表示正負(fù)號(hào)遮怜,只是考慮數(shù)值的大辛苄洹);
10000000取反后為:01111111锯梁;
01111111加1為:10000000即碗;
所以-128的二進(jìn)制表示為10000000。
假如我們還是按照左移的方式右移涝桅,那么10000000右移2位位00100000拜姿,很顯然這不是一個(gè)負(fù)數(shù),因?yàn)樨?fù)數(shù)的最高位是1冯遂,這不是我們想要的結(jié)果蕊肥,我們稱(chēng)這樣的右移為邏輯右移。
????????算術(shù)右移:左邊補(bǔ)的數(shù)和符號(hào)有關(guān)的右移稱(chēng)為算術(shù)右移蛤肌。
????????我們還是拿char類(lèi)型的變量壁却,值為-128來(lái)舉例子。從上面知道-128的二進(jìn)制表示為:10000000裸准。那么它算術(shù)右移2位是11100000,11100000是-32嗎展东?一般人不好看出來(lái),不過(guò)沒(méi)關(guān)系炒俱,我們推倒一下-32的二進(jìn)制不就行了嘛Q嗡唷!权悟!
32的二進(jìn)制表示為:00100000砸王;
00100000取反后為:11011111;
11011111加1為:11100000峦阁。
所以-128算術(shù)右移后的二進(jìn)制11100000值就是-32谦铃。
無(wú)論是邏輯右移還是算術(shù)右移,它們都有存在的意義榔昔。在單片機(jī)編程中驹闰,比如跑馬燈程序的編寫(xiě)瘪菌,就有可能需要邏輯右移,但是這些又不是數(shù)值嘹朗,更不是負(fù)數(shù)师妙,它只是一些簡(jiǎn)單的數(shù)據(jù)。
二進(jìn)制的按位求反運(yùn)算符(~)
????????取反就是將0變成1.將1變成0骡显,比如:
~1 的結(jié)果是:0疆栏;
~0 的結(jié)果是:1。
二進(jìn)制數(shù)表示浮點(diǎn)數(shù)
關(guān)于浮點(diǎn)數(shù)的計(jì)算惫谤,這里有一個(gè)比較好的參考壁顶。
二進(jìn)制表示浮點(diǎn)數(shù)
我們大概了解計(jì)算機(jī)中的浮點(diǎn)數(shù)是IEEE制定的一套表示方法,它的表示形式是科學(xué)計(jì)數(shù)法溜歪,如果想深入了解浮點(diǎn)數(shù)的表示請(qǐng)參考上面的鏈接若专,也可以自行查其它的資料,這里我們就不做深入講解了蝴猪。
由于計(jì)算機(jī)表示的浮點(diǎn)數(shù)大多數(shù)都是不精確的调衰,只有部分小數(shù)是精確的(比如0.5、0.25自阱、0.125等等)嚎莉,所以對(duì)于我們程序來(lái)說(shuō),重點(diǎn)要做的是:
- 不使用浮點(diǎn)數(shù)直接進(jìn)行運(yùn)算沛豌,而是使用整數(shù)進(jìn)行運(yùn)算趋箩,得到結(jié)果后,再除以相應(yīng)的倍數(shù)加派,這樣得到的結(jié)果才比較可靠叫确;
- 在誤差允許的情況下可以直接使用浮點(diǎn)數(shù)進(jìn)行運(yùn)算。