进制转换(整数、小数)问题的转换原理,深度详解!

  • Post author:
  • Post category:其他




十进制整数转为二进制整数

我们都知道十进制整数转换为二进制整数,用的办法是除二取余,逆序输出。



除二取余

为什么要不断得除2?因为我们

要求出每一个二进制位所对应的位权

,比如我们要将

9(D)——>1001(B)

,应该怎么做呢?

第一步:

9%2=1


问题随之而来:这个1代表着什么?

这里不得不引入一个新的概念“

位权

位权

是指数制中每一固定位置对应的单位值。

例如在十进制中个位数的位权就是1(对应10

0

),十位数的位权就是10(对应10

1

),百位数的位权就是100(对应10

2

),二进制同理,位权最低的是最后一位,对应2

0

,每个位置的位权是该位置的位置号-1,第一位的位权是0,第二位的位权是1……

好,我们接着说

9 mod 2 = 1


这个1代表的是位权为0的单位值一共有多少。

那么必然有读者会问:

  1. 为什么只有0或者1,不能有其他数字吗?
  2. 明明mod了一次2,得到的位权为什么是0?

先回答第一个问题

由于除数2的特性,我们只能得到0或1,在别的进制转换中当然可以出现别的数字。

第二个问题

我们要深刻理解“

取余

”这一名词

取余

把多余的东西取出来。 ——沃兹·基硕德

那么我们得到的这个1是不是可以理解为位权不足1个2的单位值的个数,也就等价于

位权为0的单位值的个数



这样我们就知道9的二进制数的最低位(2

0

)上的数字为1,代表

9=1*2

0

+x


我们继续求x,x=9-1=8,对8进行除二取余,

8 mod 2 = 0


在二进制中,我们让位权不变,但不考虑二进制,我们可以写成

41(B)

,但是这必然是不现实的,那么肯定有读者要问了:

为什么不先拆除1个2

1

放到这里来呢

,这样虽然现在不会出现问题,但是会对后面的结果产生影响,你想啊,正常情况下有4个2

1

,可以构成1个2

3

,但是你现在在这里取出了一个2

1

,那么剩下3*2

1

能构成什么呢?能构成1个2

2

和1个2

1

,2

2

好办,直接放在第三个二进制位处,但是剩下的一个2

1

有应该怎么办呢?2

3

前面是2

4

,肯定放不了,放了的话数字会大于原来的数字,那么如果再把它加到第二位二进制位处呢?那么原来已经有1了,现在再加上1,最终数字会变成

121(B)

,显然这不符合二进制数,其实这样我们可以将第二位向前进一位,这又变成了二进制的加法了。这里注意位权是可以累加的,最后的答案就是

1001

,我们拿最高位的1举例子,到1的时候除了4次2,得到的余数,所以位权是3,刚好对应的是2

3

次。



逆序输出

那么我们的数字是由权值高——>权值低来排序的,因此权值低的数字自然要放在后面,因此我们在结束除二取余之后只有逆序输出才能得到正确的位权排列,对应着正确的数字。

以上是十进制转换二进制

接下来是



十进制小数转换二进制小数

在上一节中我们引入了位权这一概念,知道二进制位中的最低位的位权是2

0

,现在我们增加了小数,那么参考十进制,十分位的位权是10

-1

,那么不难理解,在二进制中,小数点后的第一位的位权就是2

-1

,那么在十进制小数转二进制小数的时候我应该采取什么操作呢?



乘二取整,顺序输出



乘二取整

我们参考十进制整数转二进制整数,那里我们用的是除二取余,得到的是不满足当前位权的数,这里却是通过乘二来看满足当前位权的数,以0.8(D)为例,

0.8 * 2 = 1.6

,我们取1,这究竟是什么意思?

我们可以这样理解,因为只有一个小数大于等于0.5,对它

2之后才可能在各位上出现1,所以,这里

2是为了看在当前位权下有几个数满足,所以用的是乘二取整。



顺序输出

为什么是顺序?因为随着我乘上去的而越多,表示当前的个位上的数字的位权更小,比如位权为2

-23

上的数字,需要连续乘以23个2才会跳到个位上,因此越先得到的数位权越高,这里要和十进制整数转二进制整数区分一下,后者是越先得到的数位权越低,也恰好对应一个是乘二,一个是除二。



版权声明:本文为m0_46530392原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。