任意进制转换计算器

接触编程时总会接触有关进制转换的知识,最常见的就是10进制与二进制或十六进制之间的转换,很多时候我们总会遗忘,虽然现在也出现了很多可以直接使用的网络在线的进制转换工具,但考试中,我们就要靠自己通过公式进行运算了。
转换过程

进制到十进制转换:

十进制到进制转换:

除以基数,从余下的数字中得到数字。

除法商数余数数位

在线进制转换 十六进制,十进制转换计算器十六进制转成二进制、10进制各种进制之间的转化表 怎么用电脑计算器换算进制二进制在线解密 2进制怎么算二进制转换三进制方法 三进制转换器
1>1
相关专辑:任意进制转换RGB颜色base64格式图二进制加法厘米

关于进制转换

说到进制,可能学习汇编的人会经常碰到它,以及学习c/c++编程语言的,像学习其他编程语言可能不怎么关注二进制问题,进制这事儿,说到底就是位值原理,即:同一个数字,放在不同的数位上,代表不同大小的“量”。例如:十进制中,百位上的1表示100,十位上的1表示10。许多人认为进制转换很复杂,对其中的过程也不太清楚。但是相信今天会让你对各种进制转换有一个清晰的认识。

“数制”只是一套符号系统来表示指称“量”的多少。我们用“1”这个符号来表示一个这一“量”的概念。自然界的“量”是无穷的,我们不可能为每一个“量”都造一个符号,这样的系统没人记得住。所以必须用有限的符号按一定的规律进行排列组合来表示这无限的“量”。符号是有限的,这些符号按照某种规则进行排列组合的个数是无限的。十进制是10个符号的排列组合,二进制是2个符号的排列组合。

在网上许多篇关于不同进制之间如何转换的文章,包括很多浏览量上万的博客。大多都只是把转换的规则罗列了出来,例如十进制转二进制,可能大家都知道方法,“除以2反向取余数,直到商为0”。应用该方法的确可以解决我们遇到的进制转换问题,但是如果问我们为什么这样做呢?可能很少有人可以回答的出来。另外,二进制、八进制、十进制、十六进制之间的转换规则有一大堆,当时费很大力气记住的规则,一段时间不使用,很容易就忘记了。于是,又从头到尾看了一遍原来的文章,不断的反复这个过程,浪费了很多时间和精力。根本原因是我们不了解底层的原理,当我们了解了底层原理之后,上述进制之间的转换规则完全可以自己推导出来,根本不用死记硬背。授人以渔,不如授人以渔。解决基本的进制转换问题,可以说看本篇就足够了。

在进行进制转换时有一基本原则:转换后表达的“量”的多少不能发生改变。二进制中的111个苹果和十进制中的7个苹果是一样多的。

先从我们最熟悉的十进制入手吧,其他进制与十进制的转换方法都是一样的。整型有4种进制形式:1.十进制: 都是以0-9这九个数字组成,不能以0开头。2.二进制: 由0和1两个数字组成。3.八进制: 由0-7数字组成,为了区分与其他进制的数字区别,开头都是以0开始。4.十六进制:由0-9和A-F组成。为了区分于其他数字的区别,开头都是以0x开始。

十进制中的数位排列是这样的…… 万 千 百 十 个 十分 百分 千分……R进制中的数位排列是这样的……R^4 R^3R^2 R^1 R^0 R^-1 R^-2 R^-3……可以看出相邻的数位间相差进制的一次方。


一、预备知识

希望读者可以认真阅读本部分内容,因为后文进制转换的原理会以此部分内容为基础

以十进制数“1234”为例:

数码:就是数中每一位的数字。如1、2、3、4

数位:数码在这个数中的位置,从右到左从0开始递增。例如4的数位为0、3的数位为1

基数:就是每一位的数码可以有多少个数字来表示。其实就是所谓的进制,十进制,基数为十,数码可以取的值有10个,分别是0~9。

位权:对于多数位,处在某一位上的“1”所表示的数值的大小,称为该位的位权。例如十进制数位0,位权为 10^0 = 1,数位1,位权10^1 = 10,…, 数位为n,位权为10^n 。公式为 基数的数位次幂

补充说明,如果包含小数部分,小数点后的第一个数的数位为-1,小数点后的第二个数的数位为-2,以此类堆。

二、其他进制转为十进制

我们先从最简单的情况,转换为十进制开始介绍。对于数字11,它可能是二进制,也可能是八进制,还有可能是十进制、十六进制,为了避免产生歧义,我们统一使用在不同数字后添加不同符号字母的方式来表示不同进制的数。

不同进制所使用相应对后缀如下所示:

B, Binary (二进制)O,Octal (八进制)D,Decimal (十进制)H,Hexadecimal (十六进制)

使用了对应单词的首字母,另外,注意八进制使用字母O表示,不要和数字0混淆。

不同进制转换为十进制的规则

数码 * 基数^数位

上文有提及到,* 表示乘法运算。^表示幂运算,即基数的数位次方。基数的数位次方,就是该位的位权,然后数码乘以该位的位权就是该位数值实际表示的数的大小。

我们以1010.101B、68O、A6H转化十进制为例

1010B (基数:2,数位从右向左,从0开始)

1 * 23 + 0 * 22 + 1 * 21 + 0 * 20 + 1 * 2-1 + 0 * 2-2 + 1 * 2-3 = 10.625D

68O (基数:8)

6 * 81 + 8 * 8 0 = 48 + 8 = 56D

A6H (基数:16)

A * 161 + 6 * 160 = 10 * 16 + 6 = 166

应该很容易理解吧,任何进制转为十进制都是依据此方法计算。例如,你可以尝试算下四进制数11,七进制数11分别表示的十进制是多少?答案在评论区。

三、十进制转化为其他进制

由于整数部分和小数部分的处理方式是不同的,因此我们将分为两部分介绍。主要以二进制为例展开讲解。

1、 整数部分的转化

十进制转化为二进制的规则为什么是除以2反向取余数,直到商为0?

如下图所示:

1除以2时不够除,商为0余数为1

我将10D和展开后的1010B二进制数同时除以2,二进制数每一位的权重都减少了1,但是最后一位(最右边的一位),其数位为0无法在减少了(假如减1,那么数位就是-1,就成为小数点后一位了,然而我们想得到余数,并不想让结果为小数),余数就是最后一位的数码。

当一个某进制的整数除以该数的基数,得到的余数就是数位为0(最低位或最后一位)的数码。

本部分内容相当重要,十进制转换为其他进制的核心,所以我要尽可能详细的说明。

为了方便理解,我们以十进制数1234为例

十进制数,基数为10

1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100

两边同时除以基数10

1234 / 10 = 123 … 4

1 * 102 + 2 * 101 + 3 * 100     4 * 100

从1234的角度看4除以10不够了,所以余数4

从展开式的角度看,其他数位都可以减一,但是最后一位的数位是0,无法减一了,所以余数4 * 100 = 4,或者认为是权重为104的系数4

也就验证了上面那句话,十进制数1234除以基数10,得到的余数就是(原数1234)数位为0的数码4。

(内心OS:我个人觉得术语余数使用于展开式中,术语数位和数码适用于原数本身。)

对于123,进行递归运算就好了,十进制数123除以基数10,得到的余数就是(原数123)数位为0的数码3,同时也是(原数1234)数位为1(倒数第二位)的数码3。

回到最初的问题,十进制转化为二进制的规则为什么是除以2反向取余数,直到商为0?

现在可以解答了,

除以2是因为我们要转化为二进制数,二进制数的基数是2,

反向取余数因为每次得到的余数其实是要转换为的二进制数的
最低的数码,换句话说最先得到的余数是最低位的数码,最后得到的余数是最高位的数码,所以要反向取余数

不知道我讲明白了没有,如果有问题欢迎评论区提出来,我很希望把这部分内容讲解清楚。

2、小数部分的转换

十进制小数转化为二进制小数的规则为什么是乘以2取整,正向取整数?

如下图所示:

我们将0.625D和0.101B的展开式同时乘以2,二进制数的每一位权重都增加了1,原来的最高位的数位从-1变为了0,换句话说,该数码从小数部分的最高位变为了整数部分的最低位,该数码已经不属于小数部分了。效果好像是小数点向右移动了一位。

当一个某进制的小数乘以该数的基数,得到的整数部分的值(数位为0的数码)就是小数部分数位为-1(小数部分最高位)的数码。其效果等同于小数点向右边移动一位

为了方便理解,我们以十进制小数0.123为例


0.123 = 1 * 10-1 + 2 * 10 -2 + 3 * 10-3
两边同时乘以基数10
1.23 = 1 * 100 + 2 * 10 -1 + 3 * 10-2
从1.23角度看,乘以10后的整数部分,就是原来小数的最高位
从展开式角度看,所有数位都增加了1,原来小数的最高位,已经成为了整数的最低位,已经不是小数部分的数码了。 数位为0的数码就是小数部分数位为-1(小数部分的最高位的数码),此时数位为0的数码是1,所以小数数位的最高位为1
或者简单的理解方式,一个小数乘以该数的基数相当于小数点向右移动一位,那么得到的整数的最低位自然就是原来小数的最高位

让我们回到最初的问题:十进制小数转化为二进制小数的规则为什么是乘以2取整,正向按顺序取整数?

乘以2是因为2是二进制的基数,(相当于小数点向右移动一位)

正向按顺序取整是因为,乘以2得到的第一个整数是原来小数的最高位,得到的第二个整数时原来小数的第二最高位。可以想想小数点一步步向右移动,每次得到的都是新小数的最高位。

对于其他进制处理方式和二进制相同,乘以基数按顺序取整。

至此,我们学习了其他进制转化位十进制和十进制转化为其他进制的规则。这里做一个小总结:

其它进制转化为十进制

数码 * 基数^数位

十进制转化为其他进制

整数部分处理
当一个某进制的整数除以该数的基数,得到的余数就是数位为0(最低位或最后一位)的数码。

小数部分处理
当一个某进制的小数乘以该数的基数,得到的整数部分的值(数位为0的数码)就是小数部分数位为-1(小数部分最高位或第一位)的数码。

换个思路,一个某进制的小数乘以该数的基数,其效果等同于小数点向右边移动一位,得到的整数部分的最低为数码自然是原小数部分最高位的数码。

其实到这里就可以实现任意两个进制之间的转换了,思路是通过十进制这座桥梁,先把待转换进制转化为十进制,在把十进制转化为最终的目标进制。

不过,二进制和八进制、二进制和十六进制之间的转换还存在更简单的方式,因此我们下文继续来介绍。

四、二进制和八进制、十六进制之间的转化

1. 二进制转化为八进制、十六进制

我依然想用“展开式”的方式,来建立二进制和八进制以及二进制和十六进制之间的联系,

10000B = 20O = 10H

1*24 + 0 * 23 + 0 * 22 + 0 * 21 + 0 * 20
2 * 82 + 0 * 80
1 * 161 + 0 * 160

似乎无法找出它们在数学上的联系。获取是我数学水平没有达到,如果有哪位大佬可以看出来可以在评论区留言,不过我想尝试利用本文的预备知识来给出一个相对看似合理的解释。可以重新回顾下预备知识如果忘记了。


如图所示,一个方格表示一个二进制位,把单独一个小格看成一个整体,其能表示两种状态,换句话说,每一个位可以有两个数字来表示,所以是二进制数。

把连续的两个方格看成一个整体,其可以表示四种状态,换句话说,每一位可以有四个数字来表示,所以相当于四进制数。

把连续的三个方格看成一个整体,其可以表示8种状态,换句化说,每一个位可以有八个数字表示,所以相当于8进制。

其它略。

我们以8进制为例,

其每一个的数码包括{0, 1 , 2, 3, 4, 5, 6, 7} ,其本质就是8种连续的状态而已,我们可以使用三位二进制来表示这八种状态{000, 001, 010, 011, 100, 101, 110, 111}

10000B = 20O = 10H

2. 八进制、十六进制转化为二进制和一中描述的过程相反,每一个独立的八进制数、十六进制数转化为相应的二进制数。
任何进制中,每个数都可以按位权展开成各个数位上的数字乘以对应数位的位权,再相加的形式,如:
十进制的123=1×100+2×10+3×1
十进制的9876=9×1000+8×100+7×10+6×1
问:为啥相应的数位是1000、100、10、1?为啥不是4、3、2、1?
答:十进制,满十进一,再满十再进一,因此要想进到第三位,得有10×10;第4位得有10×10×10
这样我们就知道了:
对10进制,从低位到高位,依次要乘以10^0,10^1,10^2,10^3……,也就是1、10、100、1000
对2进制,从低位到高位,依次要乘以2^0,2^1,2^2,2^3……,也就是1、2、4、8、……
下面我们开始转换进制(以十进制换成二进制为例):
原来十进制咱们的数位叫 千位、百位、十位……
现在二进制数位变成了八位、四位、二位……
模仿上面十进制按位权展开的方式,把二进制数1011按权展开: 1011=1×2^3+0×2^2+1×2^1+1×2^0=1×8+0×4+1×2+1×1=8+2+1=11
接下来我们进行十进制往二进制的转换:
比较小的数,直接通过拆分就可以转换回去
比如13,我们把数位摆好八位、四位、二位,不能写十六了,因为一旦“十六”那个数位上的符号是“1”,那就表示有1个16,即便后面数位上的符号全部是“0”,把这个二进制数按权位展开后,在按照十进制的运算规律计算,得到的数也大于13了。那最多就只能包含“八”这个数位。 13-8=5,5当中有4,5-4=1
好啦,我们知道13=1*8+1*4+0*2+1*1 把“1”、“1”、“0”“1”这几个符号放到数位上去:
八位、四位、二位、一位
1 1 0 1
于是十进制数13=二进制数1101
现在你按照书上说的短除法来试试,会发现它和你凑数得到的结果刚好是一样的,为什么短除法可以实现进制的转换呢?为什么每次要除以进制呢?为什么要把余数倒着排列呢?
想要知道其中的道理的话,请仔细品味以下的递归原理(不知道递归没关系):
(1)一个十进制数321的末尾是1,意味着一定是……+1,省略号部分一定是10的倍数,所以一个十进制数末尾是1意味着十进制数除以进制10一定余1。所以第一次除以10之后的余数,应该放在十进制的最后一个数位“个位”,也就是说个位上的符号是1。
类比,一个二进制数111(注意,数值不等于上面十进制的111)末尾是1,意味着一定是……+1,前面的省略号部分都是2的倍数。所以一个二进制数末尾是1,意味着它对应的十进制数除以进制2一定余1。所以第一次除以2之后的余数,应该放在二进制的最后一个数位“一位”,也就是说一位上的符号是1。
(2)如果一个十进制数321“十位”是2,我们希望把它转换为(1)的情况。那么我们把这个十进制数的末尾抹掉,也就是减去“个位”上的1,再除以进制10,得到32。这样原来“十位”上的“2”就掉到了“个位”上。再把32做(1)的处理。
类比,如果一个二进制数111“二位”是1,我们希望把它转换为(1)的情况,那么我们把这个二进制数的末尾抹掉,也就是减去“一位”上的1,再除以进制2,得到11。这样原来“二位”上的“1”就掉到了“一位”上。再把11做(1)的处理。
总结:其实这个过程就是把各个数位上的符号求出来的过程。
现在你应该可以回答以下问题了:为什么短除法可以实现进制的转换呢?为什么每次要除以进制呢?为什么要把余数倒着排列呢?
R进制转换成十进制就是按权位展开,把展开式放到十进制下,再按照“十进制”的运算规律计算。因为是十进制,所以就允许使用2、3、4、5、6、7、8、9了。所以2的n次方就不用写成指数,而可以用另外的八个符号来表示了。
一、二进制与其他进制之间的转换:

1:二进制转八进制:

转换方法:利用取三合一法,即从二进制的小数点为分界点,向左(或向右)每三位取成一位。

比如利用这串二进制 1010 0100B = __?__;计算过程如下图所示,得到结果为:244。

2:二进制转十进制:

转换方法:把二进制数按权展开、相加即得十进制数。(具体用法如下图)

比如利用这串二进制 1001 0110 = __?__;计算过程如下图所示,得到结果为:150。

3:二进制转十六进制:

转换方法:利用取四合一法,即从二进制的小数点为分界点,向左(或向右)每四位取成一位。

比如利用这串二进制1010 0100B = __?__;计算过程如下图所示,得到结果为:a4。

二、八进制进制与其他进制之间的转换:

1、八进制转十进制的方法和二进制转十进制一样。

比如利用这串八进制26Q = __?__;计算过程如下图所示,得到结果为:22。

三、十进制进制与其他进制之间的转换:

1、十进制转二进制:

转换方法:“除2倒取余”,十进制小数转换成二进制小数采用“乘2取整”。

比如利用这串十进制135D = __?__;计算过程如下图所示,将135除以2,得余数,直到不能整除,然后再将余数从下至上倒取。得到结果:1000 0111。

2、十进制小数转二进制:

十进制小数转换成二进制小数采用 “乘2取整,顺序排列” 法。

转换方法:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。

比如利用这串十进制0.68D = __?__(精确到小数点后5位);计算过程如下图所示,0.68乘以2,取整,然后再将小数乘以2,取整,直到达到题目要求精度。得到结果:0.10101。

3、十进制转八进制:

转换思路同十进制转二进制一样:

比如利用这串十进制10.68D = __?__(精确到小数点后3位);计算过程如下图所示,整数部分除以8取余数,直到无法整除。小数部分0.68乘以8,取整,然后再将小数乘以8,取整,直到达到题目要求精度。得到结果:12.534。

4、十进制转十六进制:

转换思路同十进制转二进制一样:

比如利用这串十进制25.68D = __?__(精确到小数点后3位);计算过程如下图所示,整数部分除以16取余数,直到无法整除。小数部分0.68乘以16,取整,然后再将小数乘以16,取整,直到达到题目要求精度。得到结果:19.ae1。

四、十六进制进制与其他进制之间的转换:

1、十六进制转十进制:

比如利用这串十进制23daH = __?__D;计算过程如下图所示,得到结果:9178D。

下面的表格是8位二进制所对应的十进制数值,对进制转换以及类似题目的理解非常有用:
总结:十六进制每一位上可以是从小到大为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F这16个大小不同的数,即逢16进1,其中用A,B,C,D,E,F(字母使用大写)这六个字母来分别表示10,11,12,13,14,15。以上之间的进制转换,基本差不多,都需要灵活运用,好掌握这些编程基础知识。

TOP