Binary 转 BCD 码

在数字电路中,经常会遇到进制转换问题,如二进制 (Binary) 转 BCD (Binary-Coded Decimal)。针对这种数制的转换,有个很神奇的算法——double dabble algorithm,也称为 shift and add 3 algorithm

其主要流程如下(摘自wiki-Double_dabble):
Performed on the value 2431024310, looks like this:

但是为何这样工作就能得到BCD码呢?

我们考虑两个BCD码的加法 1001|0111 与 1000|0110,低四位 0111 与 0110 相加的结果是1101,这是一个不合法的BCD码,我们需要对它进行调整:加6 (0110),所得结果为 1|0011 。

在 double dabble 算法中,我们从最高位开始进行移位,相当于一个“原数×2 + 新数”的过程,想象成十进制的过程更好理解:134 = ((1×10)+3)×10+4 。
在算法的移位过程中,就有一个旧的BCD码数,我们对这个BCD码×2 (相当于 BCD码+BCD码),若乘2后某位(二进制4位长度)结果大于9,则超出合理的BCD码位置,我们就要对其进行加6调整。如若,在乘法前,判断出该位数大于4 (>=5),那么我们就对其进行加三调整,不就和上面过程结果一致了吗!(补充:乘2前<=4,则乘2后<=8,新数只能是1或者0,因此原数×2 + 新数<=9,是始终满足BCD码的条件的)

最后一次移位完就不需要满5加3了,因为此时已经满足了BCD码的条件,且后续不需要移位。

参考文献:

本文转载于https://qqdaiyu55.github.io/2015/11/26/convert-bin-to-BCD/

原文地址:https://www.cnblogs.com/ucprer/p/12339648.html

时间: 2024-10-04 19:58:55

Binary 转 BCD 码的相关文章

BCD码干什么用的?

二进制编码的十进制(Binary Coded Decimal,BCD)数据类型在计算机系统中已经存在很久了.BCD格式经常用于简化对使用十进制数字的设备(比如必须向人显示数字的设备,如时钟和计时器)的处理.处理器不是把十进制数字转换为二进制数字以便进行数学操作,然后再转换回十进制:而是可以按照BCD格式保存数字并且执行数学操作.   BCD的名称就说明了它的作用,它按照二进制格式对十进制数字进行编码.每个BCD值都是一个无符号8位整数,值的范围是0到9.在BCD中,大于9的8位值被认为是非法的.

BCD码

BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码,是用4位二进制数来表示1位十进制数中的0~9这10个数码,用一种使用二进制编码十进制的数字编码形式.BCD码这种编码形式利用四个位元来储存一个十进制的数码,从而使二进制和十进制之间的转换得以更加快捷地进行.相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免去使计算机作浮点运算时所耗费的时间.此外,对于其他需要高精确度的计算,BCD编码亦很常用. 由于十进制数共有0.1.2.…….9十个数码,

十六进制和BCD码的区别

十六进制转二进制: 将每一位十六进制转化为4为二进制位即可. BCD码: 将十进制的每一位转化为4位二进制位即可. 方法都是将每一位转为4位二进制位,但是区别是一个对应的是十六进制,一个对应的是十进制.比如给出二进制数0101 0101 如果对应十六进制,则是0x55 如果对应BCD码,则是55(注意这里是十进制的55,上面是十六进制的55)

用QuartusII实现半加器、全加器、2-4译码器、BCD码加法器、计数器、交通灯

6.交通灯实现代码 module light(clk,set,chan,light,out); input clk,set,chan; output reg[1:0] light; output reg[3:0] out; [email protected](posedge clk or posedge chan or posedge set) if(set==1) begin out=0; light=01; end else if(chan==1) begin if(light<2) lig

BCD码与十进制

BCD码(Binary-Coded Decimal?)亦称二进码十进数或二-十进制代码.用4位二进制数来表示1位十进制数中的0~9这10个数码.是一种二进制的数字编码形式,用二进制编码的十进制代码.BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行.这种编码技巧最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算.相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免却使电脑作浮点运算时所耗费的时间.此外,对于其他

C#下16进制和BCD码转换代码

[csharp] view plain copy private static Byte[] ConvertFrom(string strTemp) { try { if (Convert.ToBoolean(strTemp.Length & 1))//数字的二进制码最后1位是1则为奇数 { strTemp = "0" + strTemp;//数位为奇数时前面补0 } Byte[] aryTemp = new Byte[strTemp.Length / 2]; for (int

二进制转BCD码

应用: 用fpga实现对数码管显示,以前通常的方法是进行整除和取余进行运算,但是fpga并不擅长乘法除法运算,所以可以用BCD码来转换. BCD码:通俗的可以理解为用四位二进制数表示一位十进制数字.例如,256就可以用bcd码表示为:0010_1001_0110 因此在数码管显示中,也就是把256各位分出来,就可以用bcd码来表示,下面说一种二进制转换bcd码的方法. 加3移位法: bcd码中只有0~9十进制数,但是在四位二进制中是16进制进1,因此在移位过程中要对二进制进行判断,当在移位之后的

BCD码转换为十进制或者十进制转为BCD码

BCD码其实就是之前在数字电路中说的 用4位二进制数值 来表示一个0-9中的数字,例如: 0000=0 0001=1 0010=2 0011=3也就是说如果把一个数字作为一个BCD码,例如: 11 22那么他应该展开为: 00010001 00100010也就是对应为十进制: 17 34所以一个BCD吗转为十进制数据的思想就是: 将BCD码每个数字分离出来,例如上面的11将十位的1分离出来然后右移4位乘上一个10 在加上 个位的数字即可.十进制转BCD码的 思想:将这个十进制数字用二进制表示,高

BCD码转换成二进制和ASCII码

首先得知道什么是BCD码,可以看下百度,基本定义已经讲清楚了,百度链接:BCD码--百度百科:这里要说的也是最常用的一种BCD码:8421码.本文规定若没有特殊说明时,各个数值只会是十进制数.二进制数.ASCII值其中的一种进制数. BCD码是用4位二进制数(各个位的权重分别为:8421,所以叫8421码)来表示一位十进制数.这里的一位十进制数要特别说明下,一位十进制数只能是 0-9之间的一个数值.比如:6 就是表示一位十进制数6:66则是表示两位十进制数:666则是表示三位十进制数:(好像有点