在
C
/Java
/JavaScript
等高級語(yǔ)言編寫(xiě)的程序中, 「數值」 、 「字符串」 和 「圖像」 在計算機內部都是以 「二進(jìn)制數值」 的形式來(lái)表現的?
用二進(jìn)制數表示計算機信息的原因
計算機內部是由IC
這種電子部件構成的。IC
的所有 「引腳」 ,只有 「直流電壓」 0V
或5V
兩個(gè)狀態(tài)。
?也就是說(shuō),
IC
的一個(gè)引腳,「只能表示兩個(gè)狀態(tài)」?
IC
的這個(gè)特性,決定了計算機的信息數據只能用二進(jìn)制數來(lái)處理。由于1位(一個(gè)引腳)只能表示兩個(gè)狀態(tài),所以二進(jìn)制的計數方式就變成了0
、1
、10
、11
、100
...這種形式。
?計算機處理信息的 「最小單位」 -- 「位」 ,就相當于二進(jìn)制中的一位。
?
IC的一個(gè)引腳表示二進(jìn)制的1位
二進(jìn)制的位數一般是8位、16位、32位···· 「也就是8的倍數」 ,這是因為計算機所處理的信息的 「基本單位」 是8位二進(jìn)制數。8位二進(jìn)制數被稱(chēng)為一個(gè) 「字節」 。
?字節是最基本的**「信息計量單位」**
?
- 「位」 是最小單位
- 「字節」 是基本單位
?內存和磁盤(pán)都使用 「字節單位」 來(lái)存儲和讀寫(xiě)數據,使用 「位單位」 則無(wú)法讀寫(xiě)數據。
?
用字節單位處理數據時(shí),如果數字小于存儲數據的字節數(=二進(jìn)制數的位數),那么高位上就 「用0填補」 。例如,100111
這個(gè)6位二進(jìn)制數,用8位(=1字節)表示時(shí)為00100111
。
在程序中,即使是用 「十進(jìn)制」 和 「文字」 等記錄信息,在 「編譯」 后也會(huì )轉換成二進(jìn)制的值。
對于用二進(jìn)制數表示的信息,計算機不會(huì )區分它是數值、文字,還是某種圖片的模式,而是 「根據編寫(xiě)程序的各位對計算機發(fā)出的指示進(jìn)行信息的處理」 。
例如,00100111
這樣的二進(jìn)制數,即可以將其當做 「數值」 做加法運算,也可以當成‘
(單引號)文字而顯示在顯示器上。
?具體進(jìn)行何種處理,取決于**「程序的編寫(xiě)方式」**
?
什么是二進(jìn)制
二進(jìn)制數的值換成十進(jìn)制數的值,只需將二進(jìn)制的各 「數位」 的值和 「位權」 相乘,然后將相乘的結果相加即可。
位權
十進(jìn)制數39
的各個(gè) 「數位」 的數值,并不只是簡(jiǎn)單的3
和9
。
3
表示的是3×10=30
9
表示的是9×1=9
這里的各個(gè) 「數位」 的數值相乘的10
和1
就是 「位權」 。數字的位數不同,位權也不一樣。
- 第一位(
最右邊的一位
)是10
的0次冪(=1) - 第二位是
10
的1次冪(=10) - 第三位是
10
的2次冪(=100) - 以此類(lèi)推
? 「位權」 的思考方式同樣適用于二進(jìn)制
?
- 第一位是
2
的0次冪(=1) - 第二位是
2
的1次冪(=2) - 第三位是
2
的2次冪(=4) - 以此類(lèi)推
「〇〇
的xx次冪」 表示位權,
- 其中,十進(jìn)制數的情況下
〇〇
部分是10
,二進(jìn)制數的情況下則為2
。〇〇
被稱(chēng)為**「基數」** xx
,在任何進(jìn)制數中都是**「數的位數-1」**- 即第一位是
1-1=0
次冪 - 第二位是
2-1=1
次冪 - 第三位是
3-1=2
次冪
- 即第一位是
?數值,表示的就是構成數值的各 「數位」 的數值和 「位權」 相乘后相加的結果
?
二進(jìn)制數00100111
用十進(jìn)制數表示的話(huà)是39
,因為(0×128)+(0×64)+(1×32)+(0×16)+(0×8)+(1×4)+(1×2)+(1×1)= 39
移位運算和乘除運算的關(guān)系
和十進(jìn)制數一樣, 「四則運算」 同樣也可以使用在二進(jìn)制數中,只要注意 「逢二進(jìn)位」 即可。
移位運算
「移位運算」 指的是將二進(jìn)制數值的各數位進(jìn)行 「左右移位」 的運算。
移位有 「左移」 (向高位方向
)和 「右移」 (向低位方向
)兩種。
假設存在如下處理。把變量a
中保存的十進(jìn)制數值39
左移兩位后再將運算結果存儲到變量b
中。
a = 39;
b = a<<2;
<<
這個(gè)運算符表示 「左移」 , 「右移」 時(shí)用>>
運算符。<<
運算符和>>
運算符的 「左側」 是 「被移位的值」 , 「右側」 表示要移位的 「位數」 。
在前面我們介紹過(guò),無(wú)論程序中使用的是幾進(jìn)制,計算機內部都會(huì )將其準換成二進(jìn)制數來(lái)處理,因此都能進(jìn)行 「移位操作」 。
?針對 「左移運算」 ,空出來(lái)的低位要進(jìn)行 「補0操作」 。
?
而右移操作,由于情況特殊,我們后面再做詳細介紹。
此外,移位操作使最高位或最低位 「溢出」 的數字,直接丟棄就可以了。
下圖,就是上述代碼的運行過(guò)程。
? 「移位運算」 就好比使用二進(jìn)制表示的 「圖片模式」 像霓虹燈一樣 「左右流動(dòng)」 的樣子
?
補數
二進(jìn)制數中表示 「負數」 值時(shí),一般會(huì )把 「最高位作為符號來(lái)使用」 ,因此我們把這個(gè)最高位稱(chēng)為**「符號位」**
- 符號位是
0
時(shí)表示正數 - 符號位是
1
時(shí)表示負數
計算機在做減法運算時(shí),實(shí)際上內部是在 「加法運算」 。在表示負數時(shí)就需要使用 「二進(jìn)制的補數」 。
?補數就是**「用正數來(lái)表示負數」**
?
為了能獲取補數,需要**「將二進(jìn)制數的各位的數值全部取反,然后再將結果加1」**
例如,用8位二進(jìn)制數表示-1
時(shí),只需要求得1,也就是00000001
的補數即可。
- 將各數位的0取反加1,1取反成0
- 再將取反的結果加1
- 最后轉化成
11111111
圖例如下:
1-1在計算機內部是如何實(shí)現的
1-1
,也就是1+(-1)
,一眼就能知道答案,結果是0。
通過(guò)上文我們得知,-1
用二進(jìn)制表示為11111111
。那么,在計算機內部計算1-1
,就變成了。
00000001 + 11111111
結果確實(shí)為0
(=00000000
)。這個(gè)運算過(guò)程中出現了 「最高位溢出」 的情況, 「對于溢出的位,計算機會(huì )直接忽略掉」 。
即在8位的范圍內進(jìn)行計算時(shí)候,100000000
這個(gè)9位二進(jìn)制數就會(huì )被認為是00000000
這一8位二進(jìn)制數。
?補數求解的變換方法就是**「取反加1」**
?
將二進(jìn)制數的值取反加1的結果,和原來(lái)的值相加,結果為0
邏輯右移和算術(shù)右移的區別
右移有移位后在最高位補0
和補1
兩種情況。當二進(jìn)制數的值表示 「圖形模式」 而非數值時(shí)候,移位后需要在最高位補0。這就稱(chēng)為 「邏輯右移」 。
將二進(jìn)制數作為 「帶符號的數值」 進(jìn)行運算時(shí),移位后要在最高位填充 「移位前」 符號位的值(0
或1
)。這就稱(chēng)為 「算術(shù)右移」 。
- 如果數值是用補數表示的負數值,那么右移后再空出來(lái)的最高位補1
- 如果是正數,只需要在最高位補0即可
?只有在 「右移」 時(shí)才必須區分 「邏輯位移」 和**「算術(shù)位移」**
?
?左移時(shí),無(wú)論是 「圖形模式」 (
邏輯左移
)還是 「相乘運算」 (算術(shù)左移
),都只需要在空出來(lái)的 「低位補0」 即可。?
符號擴充
以8位二進(jìn)制數為例, 「符號擴充」 就是指在保存值不變的前提下將其準換成16位和32位的二進(jìn)制。
不管是正數還是用補數表示的負數,都只需要 「用符號位的值(0或1)填充高位」 即可。
邏輯運算
在運算中,與邏輯相對的術(shù)語(yǔ)是算術(shù)。
- 將二進(jìn)制數表示的信息作為 「四則運算」 的數值來(lái)處理就是**「算術(shù)」**
- 像圖形模式,將數值處理為單純的
0
和1
的羅列就是**「邏輯」**
計算機能處理的運算,大體可分為 「算術(shù)運算」 和 「邏輯運算」 。
- 「算術(shù)運算」 是指加減乘除四則運算
- 「邏輯運算」 是指對二進(jìn)制數 「各數字位的
0
和1
分別進(jìn)行處理」 的運算- 邏輯 「非」 (
NOT
運算) - 邏輯 「與」 (
AND
運算) - 邏輯 「或」 (
OR
運行) - 邏輯 「異或」 (
XOR
運算)
- 邏輯 「非」 (
「邏輯非」 是指的是0
變成1
、1
變成0
的取反操作。
「邏輯與」 指的是”兩個(gè)都是1“時(shí),運算結果為1
,其他情況下運算結果都為0
的運算。
邏輯與的真值表
「邏輯或」 指的是”至少有一方是1“時(shí),運算結果為1,其他情況下運算結果都是0的運算
邏輯或的真值表
「邏輯異或」 指的是排斥相同數值的運算?!皟蓚€(gè)數值不同”,也就是說(shuō),當“其中一方是1,另一方是0“時(shí)運算結果是1,其他情況下結果都是0.
邏輯異或的真值表
?在進(jìn)行邏輯運算時(shí),都是對相對應的 「各數位」 分別進(jìn)行運算
?
「大家不要把二進(jìn)制數表示的值當作數值,而應該把它看作是圖形或者開(kāi)關(guān)上的ON/OFF」 。并且, 「邏輯運算」 的運算對象不是數值,因此不會(huì )出現進(jìn)位的情況。
下圖表示的是對NI
的兩個(gè)字母的圖形模式進(jìn)行各種 「邏輯運算」 后的結果。假設白色部分表示1,黑色部分表示0.
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
719瀏覽量
41335 -
計算機
+關(guān)注
關(guān)注
19文章
6823瀏覽量
85491 -
JAVA
+關(guān)注
關(guān)注
19文章
2911瀏覽量
103283 -
字符串
+關(guān)注
關(guān)注
1文章
553瀏覽量
20266 -
javascript
+關(guān)注
關(guān)注
0文章
513瀏覽量
53492
發(fā)布評論請先 登錄
相關(guān)推薦
計算機為什么使用二進(jìn)制來(lái)表達
![<b class='flag-5'>計算機</b>為什么使用<b class='flag-5'>二進(jìn)制</b>來(lái)表達](https://file1.elecfans.com/web2/M00/AD/07/wKgZomU_XoWACW0PAAA4YR4gJDY108.jpg)
計算機基礎知識
單片機開(kāi)發(fā)為什么要用二進(jìn)制?
微型計算機基礎知識簡(jiǎn)析
為什么計算機內部進(jìn)行二進(jìn)制運算,而不是十進(jìn)制運算?
二進(jìn)制數的運算及加法電路
計算機的基礎知識
二進(jìn)制編碼和二進(jìn)制數據
計算機的二進(jìn)制概念和進(jìn)制運算的詳細資料簡(jiǎn)介
![<b class='flag-5'>計算機</b>的<b class='flag-5'>二進(jìn)制</b>概念和<b class='flag-5'>進(jìn)制</b>運算的詳細資料簡(jiǎn)介](https://file.elecfans.com/web1/M00/B1/0D/pIYBAF3wuaCAGx3iAALjnUN-cz0892.png)
計算機在硬件層面究竟是怎么表示二進(jìn)制 1
![<b class='flag-5'>計算機</b>在硬件層面究竟是怎么表示<b class='flag-5'>二進(jìn)制</b> 1](https://file.elecfans.com/web2/M00/8C/0F/poYBAGPaE3-AJVsnAAAqpahFgOc955.png)
計算機在硬件層面究竟是怎么表示二進(jìn)制 2
![<b class='flag-5'>計算機</b>在硬件層面究竟是怎么表示<b class='flag-5'>二進(jìn)制</b> 2](https://file.elecfans.com/web2/M00/8C/94/pYYBAGPaEh6AcSoEAAAFRj19T3E298.png)
評論