計算機字、字節、字長之某騰訊面試題

常常我們說機器是32位或者64位的,這裏面具體有些什麼重要的信息呢?以及我們經常掛在嘴邊的字節具體是什麼概念?還有經常被忽略的”字“、”字長“。

首先,我們瞭解這麼一個知識點,計算機在處理或者運算的時候,是把數據分成一個個固定長度數據串來處理的,這些一個個的細小數據串就是計算機的字。通常,一個字包含若干個字節(每個字節通常是8位,即8個二進制數)。而且,在存儲器中,每個單元存儲一個字,每個字又是可以通過尋址的,字的長度是用用位來表示的,即一個字能容納多少位二進制數,即下面的字長。

字長

計算機中每個字的位數(二進制數的個數)就叫字長。根據計算機不同,字長分爲固定字長、可變字長。固定字長,即字長度不論什麼情況都是固定不變的;可變字長,則在一定範圍內,其長度是可變的。

計算機的字長代表計算機的處理能力,是指它一次可處理的二進制數字的數目,即一次可處理計算的數據大小。計算機處理數據的速率,自然和它一次能加工的位數以及進行運算的快慢有關。如果一臺計算機的字長是另一臺計算機的兩倍,即使兩臺計算機的速度相同,在相同的時間內,前者能做的工作是後者的兩倍。我們常說的32位、64位機器就是說這些機器的字長度。字長大的機器CPU,假如相同處理速度的條件下,CPU的處理數據量與字長度成正比。因此,64位機器是要比32位更強!

字節

在上面說到的字,每個字中包含若干個字節(通常一個字節佔8位,8個二進制數),或者說字節是指一小組相鄰的二進制數碼,通常是8位(二進制數)作爲一個字節。字節是構成信息的一個小單位,並作爲一個整體來參加操作,比”字“小,是構成字的單位。

一個重要的信息:在計算機中,通常用多少字節來表示存儲器的存儲容量。例如,在C++的數據類型表示中,通常 char爲1個字節,int爲4個字節,double爲8個字節。

有了上面的概念,我們來算算數據的存儲。

1字節(byte) = 8 位(bit)   得到:

1kib = 2的10次方 bit = 1024 bit

即: 1kib=1024bit  或  1k字節(KiB,kilibyte) = 1024(字節)

同理,

1MiB=1024KiB

1M字節(MiB,Mebibyte)=1024K字節(2的20次方字節)

1GiB=1024MiB

1G字節(GiB,Gibibyte)=1024M字節(2的30次方字節)

1TiB=1024GiB

1T字節(TiB,Tebibyte)=1024G字節(2的40次方字節)

1PiB=1024TiB

1P字節(PiB,Pebibyte)=1024T字節(2的50次方字節)

1EiB=1024PiB

1 E字節(EiB,Exbibyte)=1024P字節(2的60次方字節)

因爲硬盤生產商是以GB(十進制,即10的3次方=1000,如1MB=1000KB)計算的,而電腦(操作系統)是以GiB(2進制,即2的 10次方,如

1MiB=1024KiB)計算的,國內用戶一般不分MB與Mib以及Kb與kib,直接把1MB=1000 KB爲1Mib=1024kib,所以好多160GB的硬盤實際容量按計算機

實際的1MiB=1024KiB算都不到160GiB,這也可以解釋爲什麼新買的硬盤“缺斤短兩”並沒有它所標示的那麼大。

最後,我們來看一道傳說騰訊的面試題目:

問題
在一個文件中有 10G 個整數,亂序排列,要求找出中位數,內存限制爲 2G,多少次計算能找出中位數?
解答

假設整數爲long,即長整形的,佔8個字節,也就是8*8bit=64bit,因此這個long整數的取值範圍是多少呢?就是無符號0~2^64次方或者有符號-2^63 ~ 2^63次方,好大好恐怖的數。

這個意思也就是說,假如無符號64bit的數,從0~2^64次方一個個存儲在一起的話,會有多大呢?答案是:2^64 * 8kib>>1E數據量>>N個TB數據>>2G內存,也就是想說,2G的內存不可能放下從0~2^64次方的所有64bit數,當然,10G的文件也不可能存儲完。

那麼現在我把我們的問題重新描述下:數字區間是0~2^64次方中間的數,大概是10G數據是整個區間所有數據大小的幾萬分之一,然後需要你只用2G的內存,也就是說那個幾萬分之一再除以一個5,來計算出這10G數據中的中位數。

我們是不是可以繼續這樣描述問題?變成一個猜字遊戲?

數字範圍是1-1000的數,總共100個,你每次最多可以從1-1000中挑選20個數字來計算出這100個數字的中位數(而且每次可以讀取20個數字),怎麼來做從而得到這100個數字的中位數呢?我們把1-1000範圍的均勻分成20個區間,0-50,50-100,100-150,150-200,…,然後每次讀取20個數,遍歷一次100個數後。比如一邊執行計算邏輯是這樣的,20個區間,哪個區間範圍出現了數字的話,就記錄下來,沒出現的自然不記錄,比如我們遍歷一次的結果是這樣幾種情況。

  1. 最糟糕的,每個區間都有出現,那麼我們可以確定中位數出現在450-500這個區間,那麼我們第二次就是把450-500繼續劃分成20個區間,然後繼續遍歷,這一次,請注意,每個區間數字範圍是多少呢?只有50/20,不到3個數字啦。這樣,我們就可以繼續這樣操作,就能精確到1!!!!
  2. 其他情況都要比最糟糕情況好處理啦,哈哈哈

所以,問題重新迴歸到10G數據用2G內存處理:

64bit整數取值區間數據總數據量大小有2^64 * 8k(64bit)大小數據,也就是

  1. 2G內存能存儲,也就是2G字節=2*2^30K = 2^31K
  2. 對64bit整數區間做2^31均勻劃分,也就是2^64 除以 2^31等於2^33次方,再遍歷10G數據
  3. 不論怎樣處理情況,一次遍歷總能確定是哪一個均勻區間,而且這個區間的長度爲2^33次方大小,並且咱們只有2^31次方的處理能力。
  4. 因此,我們還得繼續均勻劃分,並處理下,這是第二次處理。第二次處理,我們剩餘的區間長度就只有2^33 除以2^31等於2^2=4啦,也就能毫不費力的在第三次處理得出結果啦。
以上個人自以爲是的分析,歡迎交流指正!原文地址:計算機字、字節、字長之某騰訊面試題

// -_-   larro
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章