二進位制 (小白進軍程式設計師)

weixin_41380194發表於2020-12-28

1.人為什麼使用十進位制?
人有10個手指頭。
2.計算機為什麼用二進位制?
因為CPU的引腳是為了通電用的。有時候是高電頻,有的是低電頻。為了區分,就用0和1表示,0表示低點頻。1表示高點頻。
二進位制就是馮2進1. 十進位制就是馮10進1.
3.十進位制和二進位制表數的共通點就是基數(radix)
十進位制的基數為10 二進位制的基數為2
4.二進位制和十進位制的轉換
口訣 基數 * 位次冪+
比如0101 轉為十進位制
0101 = 1 * 2的零次方 + 0* 2的一次方 + 1* 2的2次方 + 0 * 2的3次方 =5
所以0101轉為十進位制就是5
其餘進位制轉為十進位制都是如此。
比如五進位制 43 轉為十進位制。
43 = 3 * 5的一次方 + 4* 5的1次方=23.

5.八進位制
前面通常用加0 比如047

6.十六進位制
0-9ABCDEF 通常用0X為字首,表示十六進位制

  1. 十進位制轉二進位制 (除2求餘數法)

在這裡插入圖片描述

8.二進位制的正數和負數
原碼:就是二進位制碼。比如十進位制的7的原碼就是00000111
反碼:將原碼中的0變為1,1變為0. 7的反碼就是11111000.
補碼:反碼 + 1 7的補碼就是:11111001
負數用補碼錶示。
正數用原碼錶示。
最高位如果是1表示負數。

十進位制的負數轉二進位制,先求解對應正數的原碼,然後最高位定為1,其餘位取反然後加1

二進位制負數轉十進位制,符號位不變,其餘位取反然後加1,得到原碼。
比如11000100轉十進位制
其餘位取反 0111011
加1得到0111100 這是原碼 即為60
負數就是-60 (這裡可以用十進位制的負數轉二進位制反驗證)

8位二進位制的範圍:
既然說是範圍,那肯定是要bai帶符號位的了,最du高位分別zhi用0,1表示正負數,其餘各位均為1,即為8位二進位制原碼錶示的範圍,即
但若是補碼就不是這個範圍了,應該是-128~+127,計算原理相同,只是數的表示方法不同,有興趣自己可以計算一下。

結論:
8位二進位制原碼的bai表示範du圍:-127~+127
8位二進位制反碼的表示zhi範圍dao:-127~+127
8位二zhuan進位制補碼的表示範圍:-128~+127
n位二進位制原碼和n位二進位制反碼:-2(n-1)-1~+2(n-1)-1;n位二進位制補碼:-2(n-1)~+2(n-1)-1。

9.為什麼負數用補碼錶示?
原因一:為了讓0的表述實現統一
00000000 這是0
它的反碼11111111
它的補碼:100000000 這是九位數了,溢位了,溢位忽略,所以補碼為00000000
因為0沒有正負數,所以補碼要和原碼一樣。所以用補碼錶示負數。
原因二:減法可以當做加法運算
CPU沒有減法器。所以用補碼錶示負數CPU就可以計算了。

10.二進位制的邏輯運算
& 遇0則0 與運算
| 遇1就1 或運算
~ 1-0 0-1 取反
^ 相加不進位(相同為0,相異為1) 異或

補符號位 (將最右位幹掉,高位正數左補0,負數左補1)右移
<< 補0 (最高位幹掉,在最右位補0) 左移

無論高位是啥直接補0 無符號右移

11.移位運算與乘除運算的關係
對於右移,直觀的理解為,對於正數來說,右1移相當於除以2(但效率比除法高);對於負數來說,沒有直觀的理解。
對於左移,直觀的理解為,對於正數來說,左移相當於乘以2(但效率比乘法高);對於負數來說,沒有直觀的理解。

12.a=3 b=4 a和b交換。
方法一:用臨時變數c
方法二:a=a^b b=a^b a=a^b

13.長整數和短整數的轉換
比如01101101 轉為十六位----00000000 01101101
比如11000110 這是負數轉為十六位 ---- 11111111 11000110
短整數轉長整數 數字大小不會變

長整數轉短整數 是將高位砍掉,這樣會數字會發生變化。

14單位:
bit 1位
byte 8位 CPU在設計的時候最低就是8位數,如果不夠自動高位補0.
MB
GB
TB
15.LITTLE ENDIAN/BIG ENDIAN(小端/大端)
超過一個位元組的數在記憶體中的儲存順序
地位在小地址-little endian
高位在小地址-big endian

相關文章