你真的懂进制转换吗?

我们日常生活中为什么要用十进制?
说实话我也不太清楚这个问题,为此还上网搜了搜,反正说什么的都有吧。我综合考虑了下,发现自己最认同“因为人类有十个手指”这个说法,anyway,这不是本文的重点,就当个引子吧~

那为什么还有二进制、八进制、十六进制呢?
在计算机领域,电气元器件通常有两种状态,通电or断电,于是这也就决定了计算机是以二进制为基础所构成的;在一些计算机系统中会运用到八进制;十六进制则一般用于编程语言中,比如内存溢出时呈现给用户的内存地址便是十六进制显示,另外IPv6的地址、MAC地址在给人阅读时也一般是十六进制。

唔,以上都是废话,如有说错权当我瞎扯~
下边正文开始!


十进制转换为任意进制

这里用到了取余数法,即用“十进制数”除以“进制数”,得到的“余数”为目标数的倒数第一位(类比十进制的个位),然后对“商”反复进行上述运算,直到“商”小于“进制数”。

到这里可能有朋友会问了,为什么要用“十进制数”做被除数呢,因为这里我们就是在说“十进制转换为任意进制”啊哈哈!

好吧,其实理论上是可以任意进制转换为任意进制的,但因为我们从小都是用十进制进行运算,所以一般我们在手算的时候,用十进制进行转换会顺手得多(当然,二的幂次倍进制数相互转化有其独特的方法,下文介绍)。

举个例子吧,十进制数174转换为九进制数:
– 174除以9,商19余3;
– 19除以9,商2余1;
– 2除以9,商0余2;
– 故转换之后的九进制数为213。

这里附上十进制转换为任意进制的代码:
[cc lang = “cpp” escaped = “true”]
int sysConvert1 (int n, int scale) { //n为十进制数,scale为10以内目标进制数
int cnt = 0, temp[100] = {0}; //举例用,如有需求请扩大数组
int result = 0;
for (int i = 0; n != 0; i++) {
temp[i] = n % scale; //取余数
n /= scale; //商
cnt++; //计数器
}
for (int i = cnt-1; i >= 0; i–)
result = result * 10 + temp[i]; //将转换之后的数组合起来
return result;
}
[/cc]
 


任意进制转换为十进制

首先请大家思考这样一个问题:
一个十进制数的个位为4,十位为7,百位为1,请问这个十进制数为多少?并写出运算过程。

嗯,非常简单!result = 100 * 1 + 10 * 7 + 1 * 4 = 174
因为十进制数的scale为10,所以从个位开始,将每位数字分别乘以100、101、102……10n,再把结果相加即可。注意,这里所说的相加是按十进位(因为符合我们的习惯),当然如果你按其它数字进位,就对应转换为其它进制了。

同理,任意进制转换为十进制的话,只需把各位数字乘以其对应的scale的0到n次方,再相加就可以了。
比如七进制数336转换为十进制数:
result = 6 * 70 + 3 * 71 + 3 * 72 = 174

这里附上任意进制转换为十进制的代码:
[cc lang = “cpp” escaped = “true”]
int sysConvert2 (int n, int scale) { //n为scale进制数
int cnt = 0, temp[100] = {0}; //举例用,如有需求请扩大数组
int result = 0;
//将原数拆解
for (int i = 0; n != 0; i++) {
temp[i] = n % 10;
n /= 10;
cnt++;
}
//组合
for (int i = 0; i < cnt; i++)
result += temp[i] * pow(scale, i); //需要加入头文件#include
return result;
}
[/cc]
 


二的幂次倍进制数的相互转换

上述两个模块所说为一般情况,这里,还有一种特殊情况。
以二进制、八进制、十六进制为例。

我们知道:
23 = 8
24 = 16
即3个二进制位等于1个八进制位,4个二进制位等于1个十六进制位。

举个例子,假设有二进制数10101110,我们要将它转换为十六进制数:
– 从二进制数低位开始,将其分为四个一组,即1010 1110;
– 这里我们需要借助一下十进制:1010(2) = 10(10),1110(2) = 14(10),括号中为scale,即二进制数1010等于十进制数10,二进制数1110等于十进制数14;
– 又因为十进制数10到15,对应于十六进制数A到E;
– 故结果为0xAE(0x表示十六进制数)。

同理,二进制转换为八进制的话,只需从低位开始三个位一组,高位不够凑的话补零即可。


好了,终于写完了~

那么八进制、十六进制分别转换为二进制的话,你可以吗?



Leave a Reply

Your email address will not be published. Required fields are marked *