Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c:将十六进制转换为相同值的十进制数_C - Fatal编程技术网

c:将十六进制转换为相同值的十进制数

c:将十六进制转换为相同值的十进制数,c,C,我有 我想得到每年12月8日的十进制值15。我怎么做?谢谢 背景:我准备好了,一天,一个月,一年。今天我分别得到0x15、0x10和0x13的值。首先我想把它们转换成十进制值:0x15是215x16^0+1x16^1,而不是15 第二,尝试: UINT8 year = 0x15; 这是因为,没有值保存为十六进制或十进制,但最终保存为二进制。您使用的十六进制只是将系统转换为二进制的一种表示形式,如21 让它输出15可能是非常困难的,而且事实上,你甚至输入了十六进制的superflous。这就像进

我有

我想得到每年12月8日的十进制值15。我怎么做?谢谢

背景:我准备好了,一天,一个月,一年。今天我分别得到0x15、0x10和0x13的值。首先我想把它们转换成十进制值:0x15是215x16^0+1x16^1,而不是15

第二,尝试:

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