请问有人能够解释一下如何将BCD转换为十六进制吗?例如,我如何将98(BCD)转换为十六进制。 谢谢。
我不太了解你的问题,但我猜测有人给你一个使用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)
);
BCD是十六进制的子集,因此无需进行转换--任何给定的BCD值与相应的十六进制值相同。例如,在BCD中,“98”是10011000,与十六进制中的98相同。
1001 1000
是98的BCD表示方式,但98的二进制表示方式是0110 0010
,也就是十六进制下的62。也许我误解了问题的意思…… - AgentConundrum98
是 10011000
,但实际上是在 BCH(二进制编码十六进制)中,因为你无法在BCD代码的短列表中编码十六进制(没有A-F数字的表示)。该操作要求从BCD转换为十六进制。因此,10011000
(BCD)应该给出十六进制值 62
(hex),因为 10011000
是二进制编码的十进制而不是二进制编码的十六进制。 - mip0001 0101
应该转换为BCH(十六进制F)的1111
。如果不需要转换,则最终结果将是十六进制15
,这可能会让您感到困惑,但输入是十进制15
。 - mipunsigned 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;
}
我会创建一个256个数据项的表,将所有BCD字节映射到它们的二进制等价物上;然后可以使用编程语言的十六进制打印。
在不同的十六进制、十进制和二进制之间进行转换。如果您知道二进制是如何工作的,那么您应该很容易地使用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