二进制编码十进制(BCD)转十六进制的转换

9

请问有人能够解释一下如何将BCD转换为十六进制吗?例如,我如何将98(BCD)转换为十六进制。 谢谢。

5个回答

11

我不太了解你的问题,但我猜测有人给你一个使用BCD编码的数字98,它应该是:

1001 1000

而你需要得到:

62H

我的建议是:

1)将BCD编码值转换为十进制值(D)

2)将D转换为十六进制值。

根据你选择的编程语言,此任务将更容易或更难。

编辑:在Java中可以这样实现:

    byte bcd = (byte)0x98; // BCD value: 1001 1000

    int decimal = (bcd & 0xF) + (((int)bcd & 0xF0) >> 4)*10;

    System.out.println(
            Integer.toHexString(decimal)
    );

那么我可以使用哪个算法来完成这个任务? - iPadDevloperJr
@Gallois:程序输入的格式是什么(BCD值)?字符串吗? - Lukasz
BCD值是一个BYTE(8位)(HHHHLLLL)。 - iPadDevloperJr
好的,谢谢。但是你能解释一下你在做什么吗?为什么要将4位进行移位并乘以10? - iPadDevloperJr
@Gallois:诀窍在于将HHHH值与LLLL值分开 - 这就是为什么要进行逻辑AND运算的原因。然后,HHHH值必须乘以10,因为它是高位(它代表“十位数”),两个值相加。在将结果存储在十进制变量中之后,我们可以使用Java API(Integer.toHexString(...))轻松地将其打印为十六进制值。 - Lukasz

10

BCD是十六进制的子集,因此无需进行转换--任何给定的BCD值与相应的十六进制值相同。例如,在BCD中,“98”是10011000,与十六进制中的98相同。


9
不是这样的。1001 1000 是98的BCD表示方式,但98的二进制表示方式是0110 0010,也就是十六进制下的62。也许我误解了问题的意思…… - AgentConundrum
2
@Agent -- 十六进制数98的二进制表示为1001 1000。0110 0010是十进制数98的二进制表示,与十六进制数98完全不同。 - Chris Dodd
2
@ChrisDodd 十六进制的 98 10011000,但实际上是在 BCH(二进制编码十六进制)中,因为你无法在BCD代码的短列表中编码十六进制(没有A-F数字的表示)。该操作要求从BCD转换为十六进制。因此,10011000(BCD)应该给出十六进制值 62(hex),因为 10011000 是二进制编码的十进制而不是二进制编码的十六进制。 - mip
在二进制表示中,BCD(十进制15)的0001 0101应该转换为BCH(十六进制F)的1111。如果不需要转换,则最终结果将是十六进制15,这可能会让您感到困惑,但输入是十进制15 - mip
2
答案完全与 OP 所需不符。 - mazhar islam

3
对于任何BCD编码的值(适合int类型),可以使用迭代方法进行转换。
迭代方法如下:
unsigned int bcd2dec(unsigned int bcd)
{
    unsigned int dec=0;
    unsigned int mult;
    for (mult=1; bcd; bcd=bcd>>4,mult*=10)
    {
        dec += (bcd & 0x0f) * mult;
    }
    return dec;
}

递归:

unsigned int bcd2dec_r(unsigned int bcd)
{
    return bcd ? (bcd2dec_r(bcd>>4)*10) + (bcd & 0x0f) : 0; 
}

2

我会创建一个256个数据项的表,将所有BCD字节映射到它们的二进制等价物上;然后可以使用编程语言的十六进制打印。


谢谢,但我想要一个计算转换的算法。 - iPadDevloperJr
@iPadDevloperJr,从技术上讲,查找表确实是一种算法。 - John La Rooy
2
+1。但是你的表格只需要154个条目,从0x00到0x99就足够了。 - kmkaplan

2

在不同的十六进制、十进制和二进制之间进行转换。如果您知道二进制是如何工作的,那么您应该很容易地使用BCD:

Hex  Dec  BCD
0    0    0000
1    1    0001
2    2    0010
3    3    0011
4    4    0100
5    5    0101
6    6    0110
7    7    0111
8    8    1000
9    9    1001
A   10    0001 0000 <-- notice that each digit looks like hex except it can only go to 9.
B   11    0001 0001
C   12    0001 0010
D   13    0001 0011
E   14    0001 0100
F   15    0001 0101

一旦掌握了这部分内容,您应该能够使用除以10或%10来找到任何组合以生成您的BCD码。由于它仅使用了10种组合而不是全部16种,因此您将丢失一些信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接