浅谈“8421码”的魅力

前言


        最近在看C++的基础知识,突然看到了十进制转换二进制的算法, 突然让我回忆起了之前经常提及的“8421码”,让我情不自禁地重新捡起它的算法,当时接触这个算法,真的是惊为天人,如今,再来学习,真的发现了其中非常有趣和魅力,现在和大家分享我的所获吧!!



先简单的介绍下,什么是 “ 8421码 ”?

8421码是一种编码方式,又为8421BCD编码,是一种二进制转化为十进制的编码方法。

    是不是想吐槽说,这尼玛是什么鬼?这也叫介绍么?确实就是这么简单,它只是一种快速从二进制转换到十进制的方法。

现在向你介绍下,它所蕴含的魅力。

赘述:我们通过用二进制表示十进制,也就是我们的整数,一般都是用八个位数表示,如果前面四个位数全是零,则可以不写,满了则在前面补零。

现在,我们用二进制分别表示8    4     2     1这四个数

8    --->>  1000

4    --->>  0100

2    --->>  0010

1    --->>  0001

仔细看看,你发现什么规律了么?

是不是发现,他们在每个不同的位数上表示了不同的十进制的数?这就8421的由来, 我们把在四个位数中的第一位表示8,第二个位数表示4, 第三个位数表示2 ,第四个则表示1.  ,如下图所示。


位数表示

学会了这个基本算法之后,你是否想问, 你这个算法也太垃圾了, 我要是计算超出15的数呢?那我怎么计算呢?? 别急!待我慢慢讲!!

精彩的还在后面。上面问题说的不错,假如超过15这个数,就好比 58,我该如何用二进制表示呢?其实我在前面就已经提示过大家,如果超过这个15就要往前面补位,这会又有人要说了,我往前面补位数,那我怎么用到8421这个算法来计算呢?

现在我教大家一个规律。

每补一次位,我们的补位的个数都要乘以16,你可以把第一个 四位,堪称是16^(1-1)

公式:sum =16^(n-1)   ,这里的n 表示的是补的次数,这里的sum表示补的次数的每个数需要乘以这个数,计算才正确。

举个例子:0001 0000  这个二进制中的1 ,表示的其实就1*16,同理,0010 0000 这里的1表示也就是2*16 。

解释一下,为什么要乘以16.是因为四个位数的二进制,其实就是十六进制的一位,可以把四个位数的二进制,看成十六进制的一位,如果大家对二进制转换十六进制不太了解的话 ,可以先去了解下。


下面内容,我就默认大家知道为什么要乘以16了!!!

我们现在来算58,转换到二进制为多少呢?

因为这里我们需要补一次,所以我们只需要用58除以16,得出的商数,用来填补【第一个】四位数,就是0011,那么怎么表示除出来的余数呢?其实余数,没有满足16,因此只能往后面补充,58-48=10 ,在【第二个】四位数中补充这个余数,就是1010,因此得到的结果是00111010

我们拿电脑内置的计算器来确认下,计算结果:


计算结果显示

如果你还有点不明白的话,我现在来举个比较实际的例子讲吧!!!

0001 0001 0001 0001 我们怎么把这个二进制转换成十进制呢?首先我们看 总共有四个 四位数【这里把一个四位数看成一个整体】,

所以最左边的四位数,每个数位的“1”都要乘以对应的16^(4-1)=4096 ,就是说,在最左边的一个四位“ 0001 ”的计算方法是:

8* 16^(4-1) *0+4*16 ^ (4-1)*0+2*16 ^ (4-1)*0+*16 ^ (4-1)*1=4096

第二个的四位算法是:( 提示:16^(3-1)=256 )

8* 16^(3-1) *0    +    4*16 ^ (3-1)*0    +    2*16 ^ (3-1)*0    +    *16 ^ (3-1)*1=256

.。。。

依此类推,最终结果是4096+256+16+1=4369

计算结果


不知道我讲到这里,你是否感受到了“8421码算法”的魅力是否吸引到你呢?

好了,今天8421码算法的魅力就介绍到这里,如果还有好玩有趣的学习内容,我会慢慢跟大家分享的,

最后感谢大家阅读本文,如果有问题,欢迎大家和我讨论。CU~!

你可能感兴趣的:(浅谈“8421码”的魅力)