從事程式設計工作也那麼長時間了,但是突然發現自己對一些基礎的概念還不是很清晰,於是找了這方面的資料又惡補了一下。其實有一篇寫得比較好的,我想如果當初我在開始入門程式設計的時候,能看到這樣的文章,也不用像以前那樣被程式設計打倒,其實還是很簡單容易懂的;
十進位制是我們最熟悉、最常用的一種計數方式,它有兩個特點:由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位址和埠號。除此,普通的程式設計師就不會知道太多了,很多時候這些知識已經夠用了。最多,寫服務程式的時候,會使用多執行緒來處理併發訪問。我們還知道如...