代碼al(代碼egg)第592條推文
作者:HuYounger
博客:Utm_medium=website
什么是二進(jìn)制
二進(jìn)制數(shù)是每個(gè)位置兩種可能的計(jì)數(shù)方法(0-1)。二進(jìn)制是計(jì)算機(jī)的執(zhí)行語(yǔ)言,但在計(jì)算機(jī)出現(xiàn)之前就存在這種計(jì)算方法,最早可以追溯到古埃及。
在日常生活中,我們使用的是十進(jìn)制,每個(gè)位置上的數(shù)有 10 種可能(0 - 9),在了解二進(jìn)制前,先看下十進(jìn)制是如何運(yùn)作的。如十進(jìn)制下的 101;這里有兩個(gè) 1 ,代表不同的含義,左邊的代表 100 ,右邊的代表 1 ,因?yàn)樽筮叺?1 在百位,而右邊的 1 在個(gè)位,同理,中間的 0 在十位。所以十進(jìn)制的 101 是 “ 百位為 1 ,十位為 0 ,個(gè)位為 1 ”,這里的位數(shù)對(duì)應(yīng)的是 10 的冪:
二進(jìn)制的位數(shù)對(duì)應(yīng)的是 2 的冪:
所以二進(jìn)制下的 101 代表 5。下圖是二進(jìn)制的前十位:
二進(jìn)制轉(zhuǎn)換
計(jì)算機(jī)運(yùn)行的是二進(jìn)制,但是我們?cè)阪I盤上輸入的并非二進(jìn)制的內(nèi)容,而是字母、數(shù)字(十進(jìn)制)、漢字等,那計(jì)算機(jī)是怎么知道把這些內(nèi)容轉(zhuǎn)成二進(jìn)制呢?計(jì)算機(jī)是人設(shè)計(jì)的,在了解計(jì)算機(jī)將我們輸入的內(nèi)容轉(zhuǎn)成二進(jìn)制前,先簡(jiǎn)單看下十進(jìn)制和二進(jìn)制的轉(zhuǎn)換。這里的套路是:
算出 2 的 n 次冪不大于要表示的值;
用要表示的值減去 2的 n 次方,得到剩下的值后,重復(fù)步驟 1,直到最后剩下 0 為止。
舉個(gè)例子,十進(jìn)制的 107 如何轉(zhuǎn)成二進(jìn)制,先找出 2 的 n 次冪不大于 107 ,算得 n = 6,用 107 減去 2的6次方 得到 43;重復(fù)下來(lái)后 :
如果該位用到,用 1 表示,否則用 0 表示。所以 107 用二進(jìn)制表示為:01101011
二進(jìn)制轉(zhuǎn)成十進(jìn)制就是相反的過程,如 01011001 轉(zhuǎn)成十進(jìn)制:
什么是比特
計(jì)算機(jī)擁有數(shù)十億超小型的數(shù)字電路,這些電路由開關(guān)組成,并且開關(guān)的狀態(tài)只有開或關(guān),分別代表二進(jìn)制中的 1 和 0 ?;叵肽切┠晡覀兲舆^的數(shù)字電路課,依稀記得當(dāng)時(shí)通過調(diào)節(jié)其中部分電路開關(guān),決定是否讓電流通過,可以看到對(duì)應(yīng)開關(guān)上的紅燈是否被點(diǎn)亮。
計(jì)算機(jī)中最小的存儲(chǔ)單位是二進(jìn)制位(binary digit),也叫比特, bit 只能夠存儲(chǔ) 0 或 1 ;而要存儲(chǔ)額外的信息(如更大的十進(jìn)制數(shù)),計(jì)算機(jī)通過串聯(lián)這些 bit 來(lái)完成。這正是它牛逼的地方,只要開關(guān)足夠多,它可以通過這些 0 和 1 代表任何內(nèi)容。由 8 bit 串聯(lián)組成的稱為字節(jié)(byte),1 個(gè)字節(jié)可以代表 256 種不同的可能(2的8次方),2 個(gè)字節(jié)可以代表 65,536 種不同的可能(2的16次方),而這只需要 16 個(gè)開關(guān) …
內(nèi)存是怎么工作的
計(jì)算機(jī)運(yùn)行的二進(jìn)制存儲(chǔ)在內(nèi)存當(dāng)中,這里的內(nèi)存英文是 random access memory (RAM) ,那么它的結(jié)構(gòu)是怎樣的呢?可以把內(nèi)存想象成一個(gè)大的書架,這個(gè)書架有幾十億層 … 每一層都有編號(hào),把每一層的編號(hào)稱為地址,每一層有 8 個(gè) bit 用來(lái)存儲(chǔ)數(shù)據(jù)。如下:
同時(shí),有一個(gè)用于執(zhí)行內(nèi)存操作的處理器和內(nèi)存控制器,內(nèi)存控制器負(fù)責(zé)接收處理器的指令,對(duì)內(nèi)存執(zhí)行讀寫操作,它可以直接操作內(nèi)存這個(gè)大書架的的每一層,如下:
這里的直接操作有多屌?它意味著我們可以先訪問 0 號(hào)地址的數(shù)據(jù),然后直接訪問 12345 號(hào)的數(shù)據(jù),而不需要在 RAM 這個(gè)大書架中挨個(gè)尋址到 12345 號(hào)。這也是random access memory (RAM)這個(gè)名字的由來(lái) — “ 立即訪問內(nèi)存的中隨機(jī)地址”
雖然內(nèi)存控制器能夠在相隔很遠(yuǎn)的內(nèi)存地址間快速切換,但是它還是傾向于訪問相鄰的地址的內(nèi)存,計(jì)算機(jī)在這方面做了優(yōu)化。處理器有一個(gè)緩存用來(lái)保存最近從 RAM 中訪問的數(shù)據(jù)的副本,如下:
處理器從緩存中讀取數(shù)據(jù)的速度快于 RAM ,因此緩存的出現(xiàn)有助于我們節(jié)省時(shí)間。當(dāng)處理器下達(dá)指令要內(nèi)存處理器去訪問某個(gè)內(nèi)存地址時(shí),內(nèi)存處理器其實(shí)還把要訪問地址的相鄰地址的內(nèi)容一起返回給處理器,處理器把這些內(nèi)容存儲(chǔ)在緩存中。
假如處理器想按順序,先后訪問地址 951、952、953、954 … 在第一次讀取地址 951 時(shí)就會(huì)把所需的內(nèi)容全部取出來(lái)放到處理器的緩存中,之后 952 、953、954 的讀取則是通過快速的緩存讀取方式獲得。
但是假如處理器先后訪問的地址是 951、321、146 … 那此時(shí)的緩存就幫不上忙了,內(nèi)存管理器每次都得老老實(shí)實(shí)的去 RAM 區(qū)獲取數(shù)據(jù),當(dāng)然速度就會(huì)比上面的慢了。
二進(jìn)制表示數(shù)字
上面我們已經(jīng)知道如何用二進(jìn)制表示十進(jìn)制,日常生活中使用的數(shù)字范圍在在計(jì)算機(jī)中可以用 4 或 8 個(gè)字節(jié)(32 或 64 bit)來(lái)表示:
4 比特可以表示的數(shù)字范圍:2147483648 ~ 2147483647
8 比特可以表示的數(shù)字范圍:9223372036854775808 ~ 9223372036854775807
二進(jìn)制還可以用來(lái)表示分?jǐn)?shù)、小數(shù)、負(fù)數(shù):
分?jǐn)?shù):分別儲(chǔ)存兩個(gè)數(shù):分子和分母
小數(shù):分別存儲(chǔ)兩個(gè)數(shù):去掉小數(shù)點(diǎn)后的數(shù)字;小數(shù)點(diǎn)出現(xiàn)的位置
負(fù)數(shù):二進(jìn)制位中最左邊的那一位代表符號(hào),0 表示正數(shù),1 表示負(fù)數(shù);
二進(jìn)制表示字符
了解了計(jì)算機(jī)如何用二進(jìn)制表達(dá)數(shù)字(十進(jìn)制),那么計(jì)算機(jī)如何用二進(jìn)制表達(dá)字符呢?計(jì)算機(jī)用到了編碼(encoding)。編碼就是一套數(shù)字和字符間的映射關(guān)系,有許多不同的編碼格式,舉個(gè)常用的例子: ASCII(American Standard Code for Information Interchange,美國(guó)信息交換標(biāo)準(zhǔn)代碼)。ASCII 編碼表可以翻譯數(shù)字、大小寫字母、以及常用的一些特殊符號(hào),有了這套規(guī)則,計(jì)算機(jī)就知道如何應(yīng)對(duì)我們輸入的內(nèi)容了:
假設(shè)我們輸入的內(nèi)容為 NICE ,通過 ASCII 編碼表首先轉(zhuǎn)化成十進(jìn)制為:
78 73 67 69
再轉(zhuǎn)成二進(jìn)制:
01001110 01001001 01000011 01000101
觀察上面這個(gè)例子發(fā)現(xiàn)
一個(gè)字符需要 8 bit 來(lái)表示,也就是 1 byte
二進(jìn)制表示字母都以 0 開頭
看起來(lái)只需要 7 bit 就能表達(dá)一個(gè)字符,第一個(gè) bit 總是 0 ,給人的感覺好像是浪費(fèi)了 1 bit,那么當(dāng)初設(shè)計(jì)這個(gè)表的時(shí)候難道沒發(fā)現(xiàn)這個(gè) bug 么?再看一眼上面的 ASCII 表,我們發(fā)現(xiàn)表中缺了很多其他特殊符號(hào),如 é、? 等等,這些符號(hào)計(jì)算機(jī)要怎么用二進(jìn)制表達(dá)呢?最初設(shè)計(jì)的 ASCII 編碼表只用到了 7 bit ,因此有 128 種可能,再把第一位利用起來(lái),ASCII 編碼表就得以翻倍擴(kuò)展。
還有其他方式可以對(duì)字符編碼,例如 Unicode 編碼表,可以用來(lái)表達(dá)世界上各個(gè)國(guó)家的字符,區(qū)別在于每個(gè)字符占用 2 個(gè) byte(這樣理論上一共最多可以表示 2的16次方(即 65536 )個(gè)字符?;緷M足各種語(yǔ)言的使用。實(shí)際上當(dāng)前版本的 Unicode 碼并未完全使用這 16 位編碼,而是保留了大量空間以作為特殊使用或?qū)?lái)擴(kuò)展)。這些編碼的核心思想是一致的:建立一套規(guī)則作為抽象層,用來(lái)簡(jiǎn)化我們?cè)谧址投M(jìn)制之間的轉(zhuǎn)化方式。
近期文章:
Python之父再度為996發(fā)聲,而我們呢?
Flutter 入門指北之常用布局
程序員寫墓志銘……
今日問題:
你還記得二進(jìn)制嗎?
在碼個(gè)蛋(codeegg)后臺(tái)回復(fù)「社群」即可加入學(xué)習(xí)群
你在看嗎?
1.《1 7用二進(jìn)制怎么表示看這里!二進(jìn)制 -- 你不知道的事》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《1 7用二進(jìn)制怎么表示看這里!二進(jìn)制 -- 你不知道的事》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/gl/2114536.html