c:将十六进制转换为相同值的十进制数
我有 我想得到每年12月8日的十进制值15。我怎么做?谢谢 背景:我准备好了,一天,一个月,一年。今天我分别得到0x15、0x10和0x13的值。首先我想把它们转换成十进制值:0x15是215x16^0+1x16^1,而不是15 第二,尝试:c:将十六进制转换为相同值的十进制数,c,C,我有 我想得到每年12月8日的十进制值15。我怎么做?谢谢 背景:我准备好了,一天,一个月,一年。今天我分别得到0x15、0x10和0x13的值。首先我想把它们转换成十进制值:0x15是215x16^0+1x16^1,而不是15 第二,尝试: UINT8 year = 0x15; 这是因为,没有值保存为十六进制或十进制,但最终保存为二进制。您使用的十六进制只是将系统转换为二进制的一种表示形式,如21 让它输出15可能是非常困难的,而且事实上,你甚至输入了十六进制的superflous。这就像进
UINT8 year = 0x15;
这是因为,没有值保存为十六进制或十进制,但最终保存为二进制。您使用的十六进制只是将系统转换为二进制的一种表示形式,如21
让它输出15可能是非常困难的,而且事实上,你甚至输入了十六进制的superflous。这就像进入21世纪,要求我们设计一种方式让系统知道你的意思是15
如果您从某个内容中得到一个十六进制值作为返回值,请尝试将其转换为字符串,并仅删除其中的0x部分
例如,如果您获取0x15作为值,只需将其作为字符串读入,并使用字符串操作切断0x。首先:0x15是215x16^0+1x16^1,而不是15
第二,尝试:
UINT8 year = 0x15;
这是因为,没有值保存为十六进制或十进制,但最终保存为二进制。您使用的十六进制只是将系统转换为二进制的一种表示形式,如21
让它输出15可能是非常困难的,而且事实上,你甚至输入了十六进制的superflous。这就像进入21世纪,要求我们设计一种方式让系统知道你的意思是15
如果您从某个内容中得到一个十六进制值作为返回值,请尝试将其转换为字符串,并仅删除其中的0x部分
例如,如果您获取0x15作为值,只需将其作为字符串读入,并使用字符串操作切断0x。在这种特定情况下,您可以使用此
UINT8 year = 0x15;
printf("%d",year);
使用编码有更好的解决方案
UINT8 year = 0x15;
UINT8 yearD = year%16+ (year/16)*10;
说明:
0x15的二进制表示是00010101. 我们有高电平10001和低电平50101。所以最终的结果是较高的半字节值*10+较低的半字节值。为了获得高半字节值,我们对0x0f执行4次右移,对低半字节按位执行4次右移,对0x0f清除高半字节,这是上半字节的实际值。为了得到较低的半字节值,我们需要清除较高的半字节值,因此我们使用年份&0x0f。在这种特定情况下,您可以使用
UINT8 year = 0x15;
printf("%d",year);
使用编码有更好的解决方案
UINT8 year = 0x15;
UINT8 yearD = year%16+ (year/16)*10;
说明:
0x15的二进制表示是00010101. 我们有高电平10001和低电平50101。所以最终的结果是较高的半字节值*10+较低的半字节值。为了获得高半字节值,我们对0x0f执行4次右移,对低半字节按位执行4次右移,对0x0f清除高半字节,这是上半字节的实际值。为了得到较低的半字节值,我们需要清除较高的半字节值,因此我们使用year&0x0f。调用您正在使用的表示,这是一种旧的编码值方法 要获得正确的十进制值,您需要知道二进制值是如何工作的,以及如何使用C中的位运算符 假设您有BCD编码值0x15,这是二进制0000101。如您所见,1存储在高位,5存储在低位。将它们自己取出是一个简单的按位and操作:
UINT8 yearD = ((year>>4)&0x0f)*10+ (year&0x0f);
现在有两个变量,一个包含0x10,另一个包含0x05。十六进制值0x05与十进制值5相同,因此无需对其进行任何处理。另一个值需要做一些工作才能使其成为十进制10。为此,我们只需将其下移四位,00010000将变为00000001
要把它转换成十进制,你需要把这个值乘以10,1*10==10,最后加上5
要将其全部放在一个表达式中,请执行以下操作:
high_nibble >> 4
您正在使用的表示被调用,这是一种旧的值编码方式 要获得正确的十进制值,您需要知道二进制值是如何工作的,以及如何使用C中的位运算符 假设您有BCD编码值0x15,这是二进制0000101。如您所见,1存储在高位,5存储在低位。将它们自己取出是一个简单的按位and操作:
UINT8 yearD = ((year>>4)&0x0f)*10+ (year&0x0f);
现在有两个变量,一个包含0x10,另一个包含0x05。十六进制值0x05与十进制值5相同,因此无需对其进行任何处理。另一个值需要做一些工作才能使其成为十进制10。为此,我们只需将其下移四位,00010000将变为00000001
要把它转换成十进制,你需要把这个值乘以10,1*10==10,最后加上5
要将其全部放在一个表达式中,请执行以下操作:
high_nibble >> 4
如果十六进制中的0x15表示十进制中的15,那么您可能正在处理中的输入 在这种情况下,从BCD到小数1的转换是通过提取输入的每一个半字节并正确地添加它们来完成的。 我们的输入是一个8位字节。 这四个字不那么重要 下位半字节表示单位,一个从0到9的数字。从不使用从A到F十六进制的值。 上半字节的4个最有意义的位代表十位。还有一个从0到9的数字 如果你把它们提取出来,你可以通过以下公式得到小数点1的值:10*10+个单位。 我们可以使用二进制掩码获得较低的半字节:year&0x0F 上半字节具有右移和相同的二进制掩码:year>>4&0x0F 整个守则是:
int decYear = ((year & 0xf0) >> 4) * 10 + (year & 0x0f);
1实际上,我们并没有将BCD转换为十进制。我们正在从BCD转换为二进制,最有可能是2-补码。printf中转换参数的选择使其以十进制打印。如果十六进制中的0x15表示十进制中的15,则您可能要处理的是输入 在这种情况下,从BCD到小数1的转换是通过提取输入的每一个半字节并正确地添加它们来完成的。 我们的输入是一个8位字节。 低半字节的4个低有效位表示单位,一个从0到9的数字。从不使用从A到F十六进制的值。 上半字节的4个最有意义的位代表十位。还有一个从0到9的数字 如果你把它们提取出来,你可以通过以下公式得到小数点1的值:10*10+个单位。 我们可以使用二进制掩码获得较低的半字节:year&0x0F 上半字节具有右移和相同的二进制掩码:year>>4&0x0F 整个守则是:
int decYear = ((year & 0xf0) >> 4) * 10 + (year & 0x0f);
1实际上,我们并没有将BCD转换为十进制。我们正在从BCD转换为二进制,最有可能是2-补码。printf中的转换参数选择使其以十进制打印。不包含字母的十六进制值是BCD。您可以像这样将BCD转换为十进制
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.
不包含字母的十六进制值为BCD。您可以像这样将BCD转换为十进制
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.
如果我理解正确,你想从0x15得到15 您可以使用以下方法:
Day 13
Month 10
Year 15
如果打印缓冲区,则得到15作为字符串。然后,您可以执行以下操作:
char buffer[4];
UINT8 year = 0x15;
sprintf(buffer, "%x", year);
如果我理解正确,你想从0x15得到15 您可以使用以下方法:
Day 13
Month 10
Year 15
如果打印缓冲区,则得到15作为字符串。然后,您可以执行以下操作:
char buffer[4];
UINT8 year = 0x15;
sprintf(buffer, "%x", year);
你没有。所有值最终都以二进制、十进制或十六进制存储,这是表示值的唯一方法。您分配给年份的值是二进制00010101,如果您使用十进制表示法打印它,您将得到21。顺便说一下@JoachimPileborg 0x15的十进制值不是37,而是21是,假设以十六进制格式表示的值实际上代表dec值。这里0x15表示十进制15,即2105。那么如何转换itOr呢?你的意思是你想使用它吗?@user3061597这没有多大意义,假设你有year=0xF,它应该用十进制表示什么?你没有。所有值最终都以二进制、十进制或十六进制存储,这是表示值的唯一方法。您分配给年份的值是二进制00010101,如果您使用十进制表示法打印它,您将得到21。顺便说一下@JoachimPileborg 0x15的十进制值不是37,而是21是,假设以十六进制格式表示的值实际上代表dec值。这里0x15表示十进制15,即2105。那么如何转换itOr呢?你是说你想使用它吗?@user3061597这没有多大意义,假设你有year=0xF,那应该用十进制表示什么?0x15可以是十进制值15。它也可以是十进制值21。它也可以是NAK字符。还有很多其他的事情。这取决于它代表的是什么。OP使用编码,其中0x15是十进制值15。他只是没有提到编码是什么,也许他甚至不知道,因为他只是在学习。BCD.0x15可能是十进制值15。它也可以是十进制值21。它也可以是NAK字符。还有很多其他的事情。这取决于它代表的是什么。OP使用编码,其中0x15是十进制值15。他只是没有提到编码是什么,也许他甚至不知道,因为他只是在学习。很可能是BCD。解释得很好。也许可以解释decYear实际上不包含十进制值,但用二进制表示该十进制值将是一种改进。您已经用property和convert提示了它。或者这超出了问题的范围。总之+1解释得很好。也许可以解释decYear实际上不包含十进制值,但用二进制表示该十进制值将是一种改进。您已经用property和convert提示了它。或者这超出了问题的范围。无论如何+1