进制转换的原理

本文探讨了进制转换的原理,解释了不同位置的数字代表的大小不同,并介绍了将十进制数转换为二进制数的短除法。短除法基于除二取余的规则,通过不断除以2并收集余数来完成转换。通过因式分解和约束条件,可以证明短除法的有效性,适用于不同进制间的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

到底代表什么

“十进制数 2127 代表什么?”

这或许是个很弱智的问题,但是 (2127)10 实际上表示:

2×103+1×102+2×101+7×100

这么写虽然看起来没什么卵用,但我想说明的是:第一个位置的 “2” 和第三个位置的 “2” 并不是一个 “2”,第一个表示的是 2000 ,即 2×103 ,而另一个表示的是 20 ,即 2×101

不同位置的 “2” 虽然都是 “2”,但是它们代表的 “大小“ 却并不相同。

我不清楚设计者为什么会创造这样的记数方式,但是这种方法确实可以有效地帮助我们理解其他进制的数,例如……

“二进制数 11010 代表多少?”

尽管很难一眼就看出这是多少,但是如果我们把它也转变为上面的写法,即:

(11010)2===1×24+1×23+0×22+1×21+0×2016+8+2(26)10

这样或许就能更容易地理解这个二进制数到底是“多少”,而实际上这也是二进制数转化为十进制数的方法。

所谓 “进制” 就是 “进位的方法”。十进制是逢十进位,用 0~9 十个数字,二进制是逢二进一,用 0、1 两个数字。同样 N 进制就是逢 N 进一,用 0~N-1 共 N 个符号表示。

一个 N 进制数从右往左数第 m 个数 a 代表的 ”大小“ 就是 a×Nm1,将各个位上的数所代表的 ”大小” 加起来就是这个数实际的 “大小” 。

关于短除法

那么十进制数如何转换为二进制数呢?

一种十分常见的方法是 “短除法”,即 “除二取余,商零为止,余数倒排”。

比如说,将 (26)10 转化为二进制数的过程为:

26÷2=13÷2=6÷2=3÷2=1÷2=13061301101

像上面这样,不断地除以 2,直到商为 0 为止,然后将得到的余数倒过来排列,就得到结果: (26)10=(11010)2

短除的原理

假设有一个二进制数 abcd,其中每个字母代表一个 0 或 1 。我们假设这个数等于十进制数 12 吧。那么我们要怎么计算 a、b、c、d 到底是 0 还是 1 呢?

按照第一节中数的意义,将 abcd 从二进制转换成十进制,那么会得到:

(abcd)2==a×23+b×22+c×21+d×20(12)10

于是我们得到了一个等式:

a×23+b×22+c×21+d×20=12

不过这是个一元四次方程,似乎并不能得到唯一解……

但是实际上我们忽略了两个重要的约束条件:

  • a、b、c、d 都是正整数。
  • 它们不是 0 就是 1。

别小看这点条件,它们的作用可是顶得上两个等式的!

首先观察一下上述等式,我们发现,除了 d 之外,a、b、c 都有共同的系数 2,于是我们就可以对前三项进行因式分解:

2×(22a+21b+c)+d=12

我们将括号内的内容看成一个整体,就叫 k 吧,不难证明 k 是个正整数,于是式子就简化成:

2k+d=12

而我们知道 d 不是 0 就是 1, k 又是正整数,那么这个式子不就等价于:

12÷2=kd

是吧?d 就是 12 除以 2 的余数,显然 d 就是 0 了!(因为 d 是 1 的话 k 就不可能是整数)那么 k 就是 6,即:

22a+21b+c=6

这个式子很熟悉是不是,除了最后一项,前几项都有公共系数 2,于是我们又可以按照前面的套路进行因式分解:

2(2a+b)+c=6

于是我们可以用与前面完全相同的方式处理,得到:

6÷2=(2a+b)c

于是就得出 c 是 0, 2a+b 是 3 。

仔细看看,这不是就和短除法一模一样的过程吗?

没错,可以这样一直算到头,并且证明方法完全相同:

2a+b=3

可得出 a 和 b,都是 1,而 c、d 都是 0,于是最终得到:

(12)10=(1100)2

总结

所以说,短除法不过是简单的逆运算,因为有了正整数和大小的约束条件,即使只有一个等式,我们可以得出唯一的正确解。

不仅是十进制和二进制,其他进制,甚至是负进制。只要理解了通过因式分解可以将等式变成整数的带余数除法等式,再进行递归计算余下部分这一思路,剩下的只是加加减减上的不同。

有兴趣的同学可以试试 这道负进制转换的题,当时想了半天的说……(NOIP2000 D1T1 我竟然都做得这么费劲/(ㄒoㄒ)/~~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值