2016-03-05 18 views
0

有時在代碼中,我看到開發人員選擇一個數字包,如32。或者在遊戲中,地圖的加載地形尺寸爲128 * 128點。 我知道它與數據類型的最大大小有關。就像Char有8位等等。
但爲什麼他們不使用像100 * 100這樣的數字作爲地圖,列表或Minecraft塊呢?爲什麼他們在編程中選擇像16,32,128這樣的數字?

如果我有8位來存儲(正數),我可以算到2^8 = 256.當我選擇一個地圖塊的大小時,我可以選擇250的寬度而不是256。但似乎這不是一個好主意。爲什麼?

+5

因爲兩個大國都是重要的,當一切都基於二進制'0's和'1's。一個跨網站的副本,令人驚訝的足夠:http://superuser.com/questions/358031/why-does-everything-in-computing-work-with-a-base-number-of-2-to-the-power -of-x – jonrsharpe

+1

128 * 128完全是16kb。在頁邊界處很好地對齊,這通常很重要。 –

+4

由於計算機只有兩個手指,稱爲0和1. 10,100,1000似乎只有你,因爲你有十個手指。 –

回答

4

有時開發商使用數字如250或100.這並不罕見。 (1920例如出現在很多屏幕分辨率中)。

但是像8,32和256這樣的數字是特殊的,因爲它們是2的冪數。對於數據類型,如8位整數,可能的元素數這種類型是2的冪,即2^8 = 256。各種存儲器邊界,磁盤頁面等的大小與這些數字很好地配合,因爲它們也是2的冪。例如,一個16,384字節的頁面可以容納2048個8字節的數字或者256個64字節的結構等。開發人員可以很容易地計算出一個尺寸的容器中容納另一個尺寸的特定尺寸的物品的數量兩個冪,因爲他們有很多記憶的數字。

+0

他們被稱爲[首選號碼](https://en.wikipedia.org/wiki/Preferred_number #Computer_engineering) – Leventix

3

上一個答案強調,具有這些尺寸的數據非常適合內存塊,這當然是正確的。然而,它並不能真正解釋爲什麼內存塊本身具有這些尺寸:

內存必須被解決。這意味着給定數據的位置必須計算並存儲在內存中的某個位置,通常位於CPU寄存器中。爲了節省空間和計算成本,這些地址應該儘可能小,同時儘可能多地處理內存。在二進制計算機上,這會導致2的冪作爲最佳內存或內存塊大小。

還有另一個相關的原因:乘以2的乘方和除法的計算可以通過移位和屏蔽位來實現。這比執行一般乘法或除法運算要好得多。例如:假設你有一個16×16的字節陣列存儲在一個連續的內存塊中,從地址0開始。爲了計算地址中的行和列索引,一般你需要計算row=address/num_columnscolumn=address % num_columns(%代表整數除法的餘數)。

在這種特殊情況下它是一個二進制的計算機更容易,例如:

address:   01011101 
mask last 4 bits: 00001101 => column index 
shift right by 4: 00000101 => row index 
+0

「爲了節省空間和計算成本,這些地址應該儘可能小,同時儘可能多地處理內存。」好評,+1 –

相關問題