平常我們用的數字系統是十進位制的,而計算機使用的是二進位制,而時、分、秒這樣的時間單位,用的是六十進位制……,這裡是進位制的轉換和一些性質。
接下來我會用
一個十進位的數字
相同的,非整數的十進位數字
而
舉例來說
在算十進位除法的時候,經常會出現循環小數,例如:
舉例來說,
1 | 4 | 7 |
---|---|---|
001 | 100 | 111 |
接下來,用 2 個 bit 表示四進位下的一個位數:
01 | 10 | 01 | 11 |
---|---|---|---|
1 | 2 | 1 | 3 |
我們得出
事實上,
當一個數字乘以
這是一種常見的的十進位轉二進位的方法:有一個數字
可以這麼做的原因是,每次取
接著是小數部分
可以這麼做是因為,每次乘以
至於
其實無論多少進位,都可以使用這種方式互相轉換,且這個方式無論在手動計算或寫程式計算都很方便,像這樣可以將 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using namespace std;
string convert(double n, int k){
int a = (int) n;
double b = n - a;
string ans;
while(a > 0){
ans += a % k + '0';
a /= k;
}
reverse(ans.begin(), ans.end());
if(b == 0) return ans;
ans += '.';
while(b > 0){
b *= k;
ans += (int)b + '0';
b -= (int)b;
}
return ans;
}
需要注意的是,有可能會遇到某進位制無法精確表示的狀況(見上方的浮點數精確性),此時在 while(b > 0)
這個迴圈就會卡住,例如 convert(0.375, 3)
就會發生這個狀況,可以加個位數限制之類的,至於手算時會比較容易注意到這個問題,就沒有太大影響。