關於進製數的一些概念總結

2021-06-20 14:29:17 字數 2655 閱讀 9743

從事程式設計工作也那麼長時間了,但是突然發現自己對一些基礎的概念還不是很清晰,於是找了這方面的資料又惡補了一下。其實有一篇寫得比較好的,我想如果當初我在開始入門程式設計的時候,能看到這樣的文章,也不用像以前那樣被程式設計打倒,其實還是很簡單容易懂的;

十進位制是我們最熟悉、最常用的一種計數方式,它有兩個特點:由0、1、2….9十個基本數字組成;運算規則是「逢十進一」。

所謂「逢十進一」,似乎在小學數學中都已經學過了,也就是當數值滿十時,就要向前進一位

個位數為9+1,滿十了,十位數就進一。

回到頂部

二進位制是計算機內部使用的一種計數方式,它有兩個特點:由0、1兩個基本數字組成;運算規則是「逢二進一」。

1> 有人可能會問:為什麼二進位制裡面沒有2~9這些數字呢?都說了,逢二進一,因此當數字滿二的時候就會進製。

2> 如果我寫個1010,你能看出它是二進位制還是十進位制麼?為了跟其他進製區分開來,書寫二進位制數的時候,需要以0b或者0b開頭。比如0b1010是個二進位制數,而1010則還是我們熟悉的十進位制數,就是「一千零一十」

做個簡單的運算吧,比如1+1

個位數是1+1,值滿二了,於是十位數要進一。因此,在二進位制中:1 + 1 = 0b10,這裡的0b10表示的是十進位制中的「二」,並不是「十」。

以此類推,11 + 1 = 0b100

1> 用二進位制表示數值,雖然簡單、方便,但是不容易閱讀,比如隨便給出個二進位制數0b110111101010,你能立刻看出它表示的是什麼數值嗎?一般需要將二進位制數轉為十進位制數後才能知道代表的什麼數值。

進製裡面有個「基數」的概念,基數是用來計算數值的,比如十進位制的基數是10,因此十進位制是這樣算數的:

1230 = 0 * 100

+ 3 * 101

+ 2 * 102

+ 1 * 103 

= 0 * 1 + 3 * 10 + 2 * 100 + 1 * 1000

二進位制的基數是2,以此類推:

0b1011 = 1 * 20

+ 1 * 21

+ 0 * 22

+ 1 * 23

= 1 * 1 + 1 * 2 + 0 * 4 + 1 * 8 = 1 + 2 + 0 + 8 = 11

因此二進位制數0b1011表示的數值是十進位制中的11

2> 一位二進位制數能表示的最大值是1,而n位二進位制數所能表示的最大值是0b111...1111,也就是說n位二進位制數都是1,那麼它的十進位制數值為:

1 * 20

+ 1 * 21

+ 1 * 22

+ 1 * 23 

+ .... + 1 * 2n-1

= 2n

- 1因此,n位二進位制數所能表示的最大值是2n

- 1。也就是說,4位二進位制數能表示的最大值是0b1111,十進位制數值為:24 - 1 = 15;5位二進位制數能表示的最大值是25 - 1 = 31。

回到頂部

八進位制有兩個特點:由0~7八個基本數字組成;運算規則是「逢八進一」。

由於十進位制和八進位制中都包含了0~7,為了區分開來,在書寫八進位制數的時候,需要在前面加個0。比如076是個八進位制數,76則是個十進位制數。

個位數是7+1,值滿八了,於是十位數要進一。因此,在八進位制中,7 + 1 = 010。010則表示十進位制中的「八」,而不是「十」

八進位制的基數是8,因此027計算出來就是十進位制中的23

027 = 7 * 80

+ 2 * 81

= 7 * 1 + 2 * 8 = 23

不難發現乙個十進位制數可以表示的最大值是9,而乙個八進位制數可以表示的最大值是7,恰好3個二進位制數可以表示的最大值0b111也是7。因此,我們可以用乙個八進位制數來代替3個二進位制數。

0b11110011 = 0b 011  110  011  = 0363

如果是八進位制轉為二進位制,那就反過來,用3位二進位制數來表示1位八進位制數

025 = 0b 010  101 = 

0b10101

回到頂部

十六進製制有兩個特點:由0~9和a~f組成,a~f分別表示10~15;運算規則是「逢十六進一」。

由於十進位制、八進位制、十六進製制中都包含了0~7,為了區分開來,在書寫十六進製制數的時候,需要在前面加個0x或者0x。比如0x76是個十六進製制數,076是個八進位制數,76則是個十進位制數。

個位數是b+5,也就是11+5,值滿十六了,於是十位數要進一。因此,在十六進製制中,b + 5 = 0x10。0x10則表示十進位制中的「十六」,而不是「十」

十六進製制的基數是16,f表示十進位制中的15,因此0x2f計算出來就是十進位制中的47

0x2f = 15 * 160

+ 2 * 161

= 15 * 1 + 2 * 16 = 47

乙個十六進製制數可以表示的最大值是15,恰好4個二進位制數可以表示的最大值0b1111也是15。因此,我們可以用乙個十六進製制數來代替4個二進位制數。

0b11110011 = 0b 1111  0011  = 0xf3

如果是十六進製制轉為二進位制,那就反過來,用4位二進位制數來表示1位十六進製制數

0x25 = 0b 0010  0101=0b100101

回到頂部

1.乙個整數「十二」的4種表示方式分別如下:

十進位制:12

二進位制:0b1100

八進位制:014

十六進製制:0xc

出自:這個部落格的文章總結的非常好,比一般的書還要容易看懂,建議初學者可以去看看。

關於KVM一些概念

kvm kernel virtual machine核心虛擬機器 是乙個linux核心模組,可以用modprobe去載入kvm模組。載入模組後,才能進一步通過其他工具建立虛擬機器。但僅有kvm模組是不行的,因為使用者無法直接控制核心模組去作事情,所以還要有乙個使用者空間的工具才行。這個使用者空間的工...

關於uboot一些概念

u boot的環境變數值得注意的有兩個 bootcmd和bootargs。bootcm bootargs bootargs是環境變數中的重中之重,甚至可以說整個環境變數都是圍繞著bootargs來設定的。bootargs的種類非常非常的多,我們平常只是使用了幾種而已.bootargs非常的靈活,核心...

關於Socket的一些概念

對於 tcp ip 我們還知道 tcp和 udp,前者可以保證資料的正確和可靠性,後者則允許資料丟失。最後,我們還知道,在建立連線前,必須知道對方的 ip位址和埠號。除此,普通的程式設計師就不會知道太多了,很多時候這些知識已經夠用了。最多,寫服務程式的時候,會使用多執行緒來處理併發訪問。我們還知道如...