BCD如何转换为十进制?
How to convert BCD to decimal?
如何将二进制编码的十进制数转换为十进制数的表示形式?我不想转换它的值,而是转换它的表示,这就是我的意思。
我想将 0x11
转换为十进制 11
(而不是 17
)并将 0x20
转换为 20
(而不是 32
)。
unsigned char day = 0x11;
unsigned char month = 0x12;
int dayDecimal, monthDecimal;
我希望 dayDecimal 为 11
并且 monthDecimal = 12
。我将使用 0x00 到 0x60 之间的范围,所以它应该是可能的。不会有 'A'、'B'、'C'、'D'、'E'、'F.
更新:
我实际上是在从 RTCC 芯片读取时间,这是我正在进行的嵌入式项目的一部分。小时、分钟、日期和月份以该形式返回。例如,如果分钟是 0x40,那么它意味着 40 分钟而不是 64 分钟,所以我需要能够正确地解释它。我需要以某种方式将 0x40 转换为 40 而不是 64。我希望这是可能的。
谢谢!
您需要处理两个 nybble,将更重要的 nybble 乘以 10,然后加上更不重要的 nybble:
uint8_t hex = 0x11;
assert(((hex & 0xF0) >> 4) < 10); // More significant nybble is valid
assert((hex & 0x0F) < 10); // Less significant nybble is valid
int dec = ((hex & 0xF0) >> 4) * 10 + (hex & 0x0F);
如果断言被禁用但输入是伪造的(例如 0xFF),您将得到应得的:GIGO — 垃圾输入,垃圾输出。您可以轻松地将其包装到一个(内联)函数中:
static inline int bcd_decimal(uint8_t hex)
{
assert(((hex & 0xF0) >> 4) < 10); // More significant nybble is valid
assert((hex & 0x0F) < 10); // Less significant nybble is valid
int dec = ((hex & 0xF0) >> 4) * 10 + (hex & 0x0F);
return dec;
}
这种转换让人联想到 BCD — Binary Coded Decimal。
非常简单的无错误检查方法:
int bcd_to_decimal(unsigned char x) {
return x - 6 * (x >> 4);
}
在函数中输入所需的值,您将在 return 中得到一个整数。
#include <stdio.h>
#include <math.h>
typedef int INT32;
typedef short int INT16;
typedef unsigned short int UINT16;
typedef unsigned long int UINT32;
UINT32 BCDToDecimal(UINT32 nDecimalValue){
UINT32 nResult=0;
INT32 nPartialRemainder, ncnt,anHexValueStored[8];
UINT16 unLengthOfHexString = 0,unflag=0;
for(ncnt=7 ;ncnt>=0 ; ncnt--){
anHexValueStored[ncnt]=nDecimalValue & (0x0000000f << 4*(7-ncnt));
anHexValueStored[ncnt]=anHexValueStored[ncnt] >> 4*(7-ncnt);
if(anHexValueStored[ncnt]>9)
unflag=1;
}
if(unflag==1){
return 0;
}
else{
for(ncnt=0 ;ncnt<8 ; ncnt++)
nResult= nResult +anHexValueStored[ncnt]*pow(10,(7-ncnt));
return nResult;
}
}
int main() {
printf("%ld\n",BCDToDecimal(0X20));
return 0;
}
如何将二进制编码的十进制数转换为十进制数的表示形式?我不想转换它的值,而是转换它的表示,这就是我的意思。
我想将 0x11
转换为十进制 11
(而不是 17
)并将 0x20
转换为 20
(而不是 32
)。
unsigned char day = 0x11;
unsigned char month = 0x12;
int dayDecimal, monthDecimal;
我希望 dayDecimal 为 11
并且 monthDecimal = 12
。我将使用 0x00 到 0x60 之间的范围,所以它应该是可能的。不会有 'A'、'B'、'C'、'D'、'E'、'F.
更新:
我实际上是在从 RTCC 芯片读取时间,这是我正在进行的嵌入式项目的一部分。小时、分钟、日期和月份以该形式返回。例如,如果分钟是 0x40,那么它意味着 40 分钟而不是 64 分钟,所以我需要能够正确地解释它。我需要以某种方式将 0x40 转换为 40 而不是 64。我希望这是可能的。
谢谢!
您需要处理两个 nybble,将更重要的 nybble 乘以 10,然后加上更不重要的 nybble:
uint8_t hex = 0x11;
assert(((hex & 0xF0) >> 4) < 10); // More significant nybble is valid
assert((hex & 0x0F) < 10); // Less significant nybble is valid
int dec = ((hex & 0xF0) >> 4) * 10 + (hex & 0x0F);
如果断言被禁用但输入是伪造的(例如 0xFF),您将得到应得的:GIGO — 垃圾输入,垃圾输出。您可以轻松地将其包装到一个(内联)函数中:
static inline int bcd_decimal(uint8_t hex)
{
assert(((hex & 0xF0) >> 4) < 10); // More significant nybble is valid
assert((hex & 0x0F) < 10); // Less significant nybble is valid
int dec = ((hex & 0xF0) >> 4) * 10 + (hex & 0x0F);
return dec;
}
这种转换让人联想到 BCD — Binary Coded Decimal。
非常简单的无错误检查方法:
int bcd_to_decimal(unsigned char x) {
return x - 6 * (x >> 4);
}
在函数中输入所需的值,您将在 return 中得到一个整数。
#include <stdio.h>
#include <math.h>
typedef int INT32;
typedef short int INT16;
typedef unsigned short int UINT16;
typedef unsigned long int UINT32;
UINT32 BCDToDecimal(UINT32 nDecimalValue){
UINT32 nResult=0;
INT32 nPartialRemainder, ncnt,anHexValueStored[8];
UINT16 unLengthOfHexString = 0,unflag=0;
for(ncnt=7 ;ncnt>=0 ; ncnt--){
anHexValueStored[ncnt]=nDecimalValue & (0x0000000f << 4*(7-ncnt));
anHexValueStored[ncnt]=anHexValueStored[ncnt] >> 4*(7-ncnt);
if(anHexValueStored[ncnt]>9)
unflag=1;
}
if(unflag==1){
return 0;
}
else{
for(ncnt=0 ;ncnt<8 ; ncnt++)
nResult= nResult +anHexValueStored[ncnt]*pow(10,(7-ncnt));
return nResult;
}
}
int main() {
printf("%ld\n",BCDToDecimal(0X20));
return 0;
}