我有
UINT8 year = 0x15;
我想从UINT8 decYear
获取year
中的十进制值15。我该怎么做 ?三江源
背景:我准备好日,月,年。我今天得到的值分别为0x15,0x10,0x13。我想将它们转换为十进制值
答案 0 :(得分:3)
您正在使用的表示称为Binary Coded Decimal,它是一种旧的编码方式。
获得正确的"您需要知道二进制值如何工作的十进制值,以及如何在C中使用按位运算符。
假设您有BCD编码值0x15
,这是二进制00010101
。如您所见,1
存储在高nibble中,5
存储在低int year = 0x15;
int high_nibble = year & 0xf0; // Gets the high nibble, i.e. `0x10`
int low_nibble = year & 0x0f; // Gets the low nibble, i.e. `0x05`
中。将它们自己取出是一个简单的按位和操作:
0x10
现在您有两个变量,一个包含0x05
,另一个包含0x05
。十六进制值5
与十进制值10
相同,因此无需进行任何操作。另一个值需要一些工作才能使其成为小数00010000
。为此,我们只需将其向下移动四位(00000001
将成为high_nibble >> 4
)做
10
和"转换"它是十进制的,你将值乘以1 * 10 == 10
(5
),最后添加int decYear = ((year & 0xf0) >> 4) * 10 + (year & 0x0f);
。
将所有内容组合成一个表达式:
ldd:FATAL: Could not load library libgtest.so.0
答案 1 :(得分:1)
在这种特定情况下,您可以使用此
UINT8 year = 0x15;
UINT8 yearD = year%16+ (year/16)*10;
使用BCD编码
有更好的解决方案 UINT8 yearD = ((year>>4)&0x0f)*10+ (year&0x0f);
说明:
0x15
的二进制表示形式为00010101
。我们有nibble高{1 0001
)和低半字节5(0101
)。所以最终结果是higher nibble value *10 + value of lower nibble
。要获得高半字节值,我们会shift直到bitwise AND 0x0f
,4右移高半字节值到低半字节,bitwise and
0x0f
清除year&0x0f
高位半字节,这是高位半字节的实际值。为了获得更低的半字节值,我们需要清除更高的半字节值,以便我们使用<comp name = "a">
<subcomp1 name = "a1">
<subcomp2 name = "a2"/>
</subcomp1>
<subcomp3 name="a3/>
</comp>
。
答案 2 :(得分:0)
首先:0x15
是21
(5 x 16 ^ 0)+(1 x 16 ^ 1),而不是15。
其次,试试:
UINT8 year = 0x15;
printf("%d",year);
这是因为,没有值保存为十六进制或十进制,但最终保存为二进制。您使用的十六进制只是将系统转换为二进制的表示形式,如21
。
使它输出15可能会非常困难,并使你甚至以十六进制超级输入它。它就像进入21
并要求我们设法让系统知道你的意思15
如果你从某个东西得到一个十六进制的值,请尝试将其转换为一个字符串,然后切断它的0x
部分。
例如,如果您将0x15
作为值,则只需将其作为字符串读取,然后使用字符串操作切断0x。
答案 3 :(得分:0)
如果0x15(十六进制)表示15(十进制),那么您可能正在处理BCD format中的输入。
在这种情况下,从BCD转换为十进制(1)是通过提取输入的每个nible并正确添加它们来完成的。
我们的输入是一个8位的字节
4个较少有意义的位(较低的半字节)表示单位,从0到9的数字。从不使用从A到F(十六进制)的值。
4个最有意义的位(高位半字节)代表十位。也是0到9之间的数字。
如果你提取它们,你会得到小数(1)值的公式:tens * 10 + units
我们可以使用二进制掩码获得较低的半字节:year & 0x0F
并且上半字节具有右移和相同的二元掩模:(year>>4) & 0x0F
整个代码是:
UINT8 year = 0x15;
assert ( ( (year>>4) & 0x0F ) < 10 ); // Ensure top nibble correctness
assert ( (year & 0x0F) < 10); // Ensure low nibble correcness
int yearBin = ( (year>>4) & 0x0F ) * 10 + (year&0x0F);
printf("%d\n", (int)yearBin); // Print yearBin in decimal : 15 will be printed
printf("%x\n", (int)yearBin); // Print yearBin in hexadecimal :
// 0x15 will not be printed. 0xF will be printed.
(1)实际上,我们没有将BCD转换为十进制。我们正在从BCD转换为二进制(最有可能是2补码)。它是printf中转换参数的选择,是以十进制打印的。
答案 4 :(得分:0)
“不包含字母的十六进制值”为Binary Coded Decimal(BCD)。您可以像这样将BCD转换为十进制
#include <stdio.h>
#include <stdint.h>
uint8_t bcd2dec(uint8_t bcdval)
{
return (bcdval >> 4) * 10 + (bcdval & 0xF);
}
int main(int argc, char *argv[])
{
printf("Day %u\n", bcd2dec(0x13));
printf("Month %u\n", bcd2dec(0x10));
printf("Year %u\n", bcd2dec(0x15));
return 0;
}
节目输出:
Day 13
Month 10
Year 15
答案 5 :(得分:0)
所以,如果我理解正确,你想从0x15得到15。
您可以使用以下方法:
char buffer[4];
UINT8 year = 0x15;
sprintf(buffer, "%x", year);
如果你打印缓冲区,你会得到一个字符串“15”。然后你可以这样做:
UINT8 decYear = atoi(buffer);