我有function
。它的目的是将两个数字(两个uint8_t
)作为参数传入,并添加数字的两个第一个数字,然后添加数字的第二个数字,最后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.你能告诉我我在这里做错了吗?
答案 0 :(得分:1)
代码执行或|
应添加+
:
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 sum,则需要携带&gt; 9.如果第二个数字> OP,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;
}
答案 1 :(得分:0)
@Dukeling你从一开始就是对的,问题确实是&lt;&lt; 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);
}