前言
進制轉換有如下幾種常見情況:
- 十進制轉換為其他進制
- 其他進制轉換為十進制
- 二進制轉換為其他進制
- 八進制轉換為其他進制
- 十六進制轉換為其他進制
十進制轉換為其他進制
十進制轉其他進制:取餘法。下面以十進制轉二進制為例,請看下圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcsQXYtJ3bm9CXldWYtlWPzNXZj9mcw1ycz9WL49TQNBTW6xkUsxGZHBHWiFnUIRVNstWZxpFShhGbXR2M3JDVvJVRih3ZHJGao1GZ2FzRTFTUtNFbWpWWVlTblJjSYFlbCZVZzplbUJHdFJFdkFTYLZlekFFdyE1dZNTY1gzRiFmUwIGNNdVYYxGSPZjVxM1Qw1WUzgzaiFVO5pVdCNDW2wWbZRXMywUdO1GTqx2RjhXNpVGcKdlY0lTeMZTTINGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
是以十進制105對應的二進制數為1101001,即最後一個餘數寫在前面,以此類推寫到最後一個餘數。同樣的,十進制數轉換為其他進制數也遵循這樣的規則。
由此可設計出如下函數:
int deci_to_other_scale(uint deci_num, int scale, char s[])
{
static char ch[] = "0123456789ABCDEF";
char buf[N + 1];
int i = N, j;
if ( !(scale >= 2 && scale <= 16) )
{
s[0] = '\0';
return 0;
}
buf[N] = '\0';
do
{
buf[--i] = ch[deci_num%scale];
deci_num /= scale;
}while(deci_num);
for ( j = 0; j < N-1; j++ )//for ( j = 0; (s[j] = buf[i])!='\0'; i++, j++ );
{
s[j] = buf[i];
i++;
}
return j;
}
定義一個數組buf,用于儲存餘數,數組最後一個元素儲存第一個餘數,倒數第二個元素儲存第二個餘數,依次類推。
然後再把數組buf的元素值依次賦給函數的形參s[],這裡把形參s[]稱為輸出參數,因為這個參數可以把函數内的資料帶到該函數外使用。
其他進制轉換為十進制
以八進制數轉化為十進制數為例。如下圖:
是以其他進制轉換為十進制,首先需要分離出該進制數的各位數,再按權展開,相加即得十進制數。
由此可設計出如下函數:
/*
如八進制776 = 7*pow(8,2) + 7*pow(8,1) + 6*pow(8,0) = 510
*/
int other_scale_to_deci(char *other_num, int scale)
{
const char figure[] = "0123456789ABCDEF";
char i, j;
char other_len = strlen(other_num), figure_len = strlen(figure);
char deci_num[other_len];
int deci_sum = 0;
char flag = 0;
/* 分離scale進制數的各位,如八進制776分離成7,7,6 */
for ( i = 0; i < other_len; i++ )
{
for ( j = 0; j < scale; j++ )
{
if ( other_num[i] == figure[j] )
{
deci_num[i] = j;
flag = 1;
}
}
/* 不是scale進制數則退出函數 */
if(flag == 0)
{
printf("Input Error!Please Input Again!\n");
return 0;
}
flag = 0;
}
/* scale進制轉化為十進制,如八進制轉換為十進制數:776 = 7*pow(8,2) + 7*pow(8,1) + 6*pow(8,0) = 510 */
for ( i = 0; i < other_len; i++ )
{
deci_sum += deci_num[other_len-1-i]*pow(scale, i);
}
return deci_sum;
}
二進制轉換為其他進制
二進制轉換為其他進制:先把二進制轉化為十進制數,十進制數再轉化為其他進制數。(可調用以上兩個函數完成)
可設計如下函數:
int binary_to_other_scale(char *binary_num, int scale, char s[])
{
int deci_sum = 0;
deci_sum = other_scale_to_deci(binary_num, TWO_SCALE);
return deci_to_other_scale(deci_sum, scale, s);
}
八進制轉換為其他進制
八進制轉換為其他進制:先把八進制轉化為十進制數,十進制數再轉化為其他進制數。
可設計如下函數:
int oct_to_other_scale(char *oct_num, int scale, char s[])
{
int deci_sum = 0;
deci_sum = other_scale_to_deci(oct_num, EIGHT_SCALE);
return deci_to_other_scale(deci_sum, scale, s);
}
十六進制轉換為其他進制
十六進制轉換為其他進制:先把十六進制轉化為十進制數,十進制數再轉化為其他進制數。
可設計如下函數:
int hex_to_other_scale(char *hex_num, int scale, char s[])
{
int deci_sum = 0;
deci_sum = other_scale_to_deci(hex_num, SIXTEEN_SCALE);
return deci_to_other_scale(deci_sum, scale, s);
}
以上就是各進制之間的轉換函數。核心函數為:“十進制轉換為其他進制”與“其他進制轉換為十進制”。其他函數都是根據這兩個函數設計的。程式測試範例結果如下:
完整程式提供測試函數。擷取完整程式的方法:關注微信公衆号【嵌入式大雜燴】,并在公衆号回複關鍵字進制轉換。