我有这个function。它的目的是将传入的两个数字(都是uint8_t)作为参数,并将数字的两个1位数相加,然后添加数字的2位数,最后OR两个结果并返回最后的值。
现在的功能不能正常工作:
uint8_t FormatDSMode(uint8_t data,uint8_t mode)
{
return (((data/10)<<4)|((mode/10)<<4))|(((data%10)|(mode%10)));
}例如:
当我将参数11和60 (都是dec值)传递给我时,结果是81而不是71。你能告诉我我在这里做错了什么吗?
发布于 2013-12-25 15:20:16
代码执行一个或|,它应该在其中添加+
uint8_t FormatDSMode(uint8_t data,uint8_t mode) {
//(((data/10)<<4)|((mode/10)<<4))|(((data%10)|(mode%10)))
return (((data/10)<<4)+((mode/10)<<4))|(((data%10)+(mode%10)));
}由于您正在进行BCD转换,请用十六进制打印您的答案,以查看71
int main() {
printf("%X\n", FormatDSMode(11,60));
// 71
return 0;
}此外: FormatDSMode()可能是“不正确的BCD转换/加法”。需要携带如果LSDigit和> 9。OP需要考虑做什么,如果第二位数> 9。其他简化可能。
uint8_t FormatDSMode(uint8_t data,uint8_t mode) {
uint8_t Sum = data%10 + mode%10;
return ((data/10 + mode/10 + Sum/10) << 4) + Sum%10;
}发布于 2013-12-25 21:41:22
@Dukeling您从一开始就正确,问题确实是<< 4将创建所需的数字,但以十六进制的形式出现。下面的职能是正确的:
uint8_t FormatDSMode(uint8_t data,uint8_t mode)
{
uint8_t digit1; //decades digit
uint8_t digit2;
digit1=((data/10))|((mode/10));
digit2=((data%10))|((mode%10));
return (digit1*10+digit2);
}https://stackoverflow.com/questions/20774144
复制相似问题