将二进制数转换为任何基础

文章作者:Mitja Rihtarsic

学习双涉猎,和其他有效的基础转换的进出。

固件中经常需要将二进制数转换为十进制数。如果10的乘法和除法是可以接受的,那么做起来就很容易了。然而,这些操作,特别是分割,可能对低成本的微控制器(MCU)来说过于消耗资源。

因此,我很高兴了解了这一点<我>双倍拖走有效地将二进制转换为十进制的算法;它马上就进了我的魔术包。尽管如此,我还是想根据我的需要来调整它,以便与任何底座一起工作。要做到这一点,我需要知道它实际上是如何工作的。

双达贝布属于两组算法中的第二个(移位调整和调节班次)。两者都可用于将二进制数转换为其他格式。其中,转换为HMS的时间或角度格式是特别有用的。此外,最近已经有三元(基本-3)的设计和讨论了edn万博投注网址<一个href="https://www.edn.com/design-ideas/all" target="_blank" rel="noopener noreferrer">设计理念适用。

转换以二进制数开始:

一个= 2<我>N1一个N1+…+ 2<我>n一个n+…+ 2<我>一个1+<我>一个0(1)

在哪里<我>一个是位。<我>N存储数字需要位<我>一个.的<我>一个是0或1.一个例子是110110112

数字<我>一个由总和定义:

一个=<我>Bp+ ...... +<我>Bmpm+ ...... +<我>B1p1+<我>p0(2)

常数<我>Bm取决于数字系统。在十进制中,这些是基础常数的产品<我>b如下(3)所示。在定义(2)中,<我>p对应的是小数点。

b0= 10<我>B1=<我>b0= 10
b1= 10<我>B2=<我>b1B1= 100
...
bm1= 10<我>Bm=<我>bm1Bm1= 10<我>m(3)
...

十进制系统不是唯一有趣的系统。例如,时间,在基地60.现在,<我>p0,<我>p1, 和<我>p2分别是秒,分钟和几小时。

b0= 60.<我>B1=<我>b0= 60.
b1= 60.<我>B2=<我>b1B1= 3600 (4)

除了在机械时钟的表盘上,时间是用阿拉伯数字显示的,以9结束,这个数字远小于59。既然没有必要那样做<我>b在(2)中等于,解决方案很简单。用阿拉伯数字写入时间,使用下一个数字系统(5)。地点<我>p0和<我>p1在十进制系统中的几秒钟,<我>p2和<我>p3.是几分钟,<我>p4显示时间。

b0= 10<我>B1=<我>b0= 10
b1= 6.<我>B2=<我>b1B1= 60.
b2= 10<我>B3.=<我>b2B2= 600.
b3.= 6.<我>B4=<我>b3.B3.= 3600 (5)

另一个系统的常数可以是<我>b0= 12<我>b1= 3;A是英寸长度,而<我>p2,<我>p1, 和<我>p0分别是码、英尺和英寸。

在本文后面,我们将讨论一个三元系统。它有以下基本常数:

b0= 3<我>B1=<我>b0= 3
b1= 3<我>B2=<我>b1B1= 9
...
bm1= 3<我>Bm=<我>bm1Bm1= 3<我>m(6)
...

当讨论数值系统时,那么地点<我>pm是整数,限于间隔

0≤<我>pm<<我>bm(7)

pm必须小于相应的基础常数<我>bm.对于小数,<我>pm是否为整数:0≤<我>pm<10.但总和(2)

也适用于地方<我>pm取超过间隔(7)的值!这甚至是不必要的<我>p'是整数,但我们应该保持正整数,因为,嗯,mcu。

让我们假设<我>一个是二进制数0xFF和基数常量<我>Bm属于十进制系统(3)。等式(2)即使在<我>p0= 255,<我>p1= 0,和<我>p2= 0。这是一个极端。它也适用于<我>p0= 25,<我>p1= 13,<我>p2= 1.但通常,值是<我>p0= 5,<我>p1= 5,<我>p2= 2.即,0xFF = 255。

在碱基之间转换的代码或硬件中,<我>Rm为每个地方分配了存储器<我>pm.通常,轻咬(<我>Rm= 4)或字节(<我>Rm= 8)被使用。2 .分配的内存足够大<我>Rmbm持有。仍然,分配的内存块应该有点较大,以便为位携带提供一些空间。因此,这个地方<我>pm是一个限制在区间0≤的整数<我>pm<2<我>Rm

额外的空间<我>pm易于携带<我>pm来<我>pm+1.这一点携带了什么?它是在执行时执行的<我>pm+1加1(位)和<我>pm由基本常数递减<我>bm.递减是可能的<我>pm≥<我>bm.我们有一个二进制数<我>一个= 0xDB和基本常量<我>bm(3),然后,让这些地方<我>p2= 2,<我>p1= 0,和<我>p0= 19.我们可以看到等式(2)持有。我们还可以看到至少需要五个比特来存储<我>p0.携带<我>p0来<我>p1,地方<我>p1递增1和1<我>p0是递减的<我>b0= 10。的<我>p0和<我>p1调整。现在,这些地方<我>p2= 2,<我>p1= 1,<我>p0= 9.即,0xDB = 219.在该位携带期间,等式(2)始终有效。

如前所述,钻头携带由两个步骤组成。一步,原地踏步<我>pm+1递增。在另一个步骤中,基础常数<我>bm减去从<我>pm.这两个步骤可以合并为一个地方<我>pm+1和<我>pm进入一个数字2<我>Rmpm+1+<我>pm.这个数字已经存在<我>p的值在单片机的存储器中依次分配。也就是说,两个连续的字节组成一个unsigned int。然后是进位常数2<我>Rm- - - - - -<我>bm加到这个新数字中。效果可以从(8)中看出,高字节加1,低字节减1<我>bm

pm≥<我>bm(2<我>Rmpm+1+<我>pm)+(2<我>Rm- - - - - -<我>bm) = 2<我>Rm(<我>pm+1+ 1) + 1<我>pm- - - - - -<我>bm) (8)

调整场所的顺序<我>pm在(2)中不起作用。任何一对位置<我>p0,<我>p1或者<我>p,<我>p1或者可以先调节任何其他对。这是因为在任何一点携带后都有等式(2)。尽管如此,可以从中执行调整是有益的<我>p0向上。这样,没有<我>pm需要调整两次。通过重复调整,个人的价值<我>p'的值会变小,直到条件(7)对所有值都有效<我>pm.的地方<我>pm被认为是调整过的。

二进制到其他系统的转换只能通过位进位来实现。初始二进制数<我>一个被搬进去了<我>p0,这必须足够大。然后,重复比特携带,直到满足条件(7)<我>p在这一点上,数字<我>一个转换了。虽然这种方法有效,但它效率低下。为了加快转换,介绍了与乘以二乘以相同的左转换。然后,顺序地执行转换和比特携带。每次移位后执行该位携带以保持所需的大小<我>p它尽可能地小。同时,条件(7)得到满足。因为这个序列,这被称为移位-调整算法。

该算法是迭代运行的。在初始化迭代中<我>我= 0,全部<我>p被清除了。因此,等式(9)为零。当然,条件(7)持有全部<我>pm, 也。

Bp(<我>我= 0) +…+<我>Bmpm(<我>我= 0) +…+<我>B1p1(<我>我= 0) +<我>p0(<我>我= 0) = 0 (9)

现在,方程乘以2。同时,比特<我>一个N1,这是MSB<我>一个在(1)中,加到<我>p0.在汇编程序中,这是通过左旋转进行<我>一个和<我>p0.其他内存块<我>p应该足够大,以便<我>p在移动过程中不能溢出。它们是单独移动的。

2(<我>Bp(<我>我= 0) +…+<我>Bmpm(<我>我= 0) +…+<我>B1p1(<我>我= 0) +<我>p0(<我>我= 0))+<我>一个N1=<我>一个N1(10)

换档后,(10),重复该位携带,直到满足(7)的条件<我>m.第一次轮班后不需要调整。但要坚持shift-adjust算法,调整<我>p每次班次后携带就会发生。完成第一次迭代后,(7)为所有人持有<我>m.获得等式(11),其是对第二迭代的输入。

Bp(<我>我= 1)+ ... +<我>Bmpm(<我>我= 1)+ ... +<我>B1p1(<我>我= 1)+<我>p0(<我>我= 1)=<我>一个N1(11)

现在,转移和调整再次发生。

Bp(<我>我2) +名词+名词<我>Bmpm(<我>我2) +名词+名词<我>B1p1(<我>我= 2)+<我>p0(<我>我= 2)= 2<我>一个N1+<我>一个N2(12)

序列重复<我>N两度。

Bp(<我>我=<我>N) +…<我>Bmpm(<我>我=<我>N) +…<我>B1p1(<我>我=<我>N)+<我>p0(<我>我=<我>N) = 2<我>N1一个N1+…+ 2<我>一个1+<我>一个0(13)

最后一位进位结束后,二进制数<我>一个位于(13)的右侧。在左手边,<我>一个被转换成所需数字系统的数字。这些数字存储在<我>p的年代。

[继续阅读EDN美国:<一个href="https://www.edn.com/design/systems-design/4460458/2/Convert-binary-number-to-any-base" target="blank" rel="noopener noreferrer">例子,三元,&代码]

相关文章

- - - - - -<一个href="https://www.edn.com/user/MiR1" target="_blank" rel="noopener noreferrer">MitjaRihtaršič拥有硕士学位,一直从事无刷直流电机控制器和压缩空气设备电子产品的设计。

留下你的评论