我在这里有一个小型“PLC”,它运行在32位MCU上。 我可以定义的最大变量是uint32(unsigned int)。 我正在读一米,它给了我6位字符(通过串行线)的48位值。 我现在有这个值存储在两个32位通过移动字符。在32位机器上使用48bit
T1Low = (unsigned int) mybuffer[3] << 24 | (unsigned int) mybuffer[2] << 16 |
(unsigned int) mybuffer[1] << 8 | (unsigned int) mybuffer[0];
T1High = (unsigned int) mybuffer[5] << 8 | (unsigned int) mybuffer[4];
但我想用1000除以48位值,并将其保存到一个32位(因为分之后,它会给我足够的精度)。
从理论上讲是这样
unsigned int result = (T1High << 32 | T1Low)/1000;
当然,这并不因为太大转变的工作... 有什么办法如何做到这一点?
编辑:分辨率的描述: 在千瓦时电表措施,但该值以Wh给出。最大值是9 999 999,这足以保存在32位。但从米我会得到9 999 999 000 ...所以我需要在最后削减3个零..
编辑2:正确的答案是由cmaster :) 如果有人想把代码只有2行,则:
unsigned int value1;
unsigned int value2;
unsigned int value3;
value2 += (value1%1000) << 16;
unsigned long result = ((value2/1000) << 16) | ((value3 + ((value2 % 1000) << 16))/1000);
你需要查找“多精度运算”左右。是的,有办法做到这一点。例如,完整的通用解决方案([GMP](https://gmplib.org/) - GNU Multi-Precision)可能会矫枉过正,但您最终会使用函数来完成这项工作,而且它们不会不重要的。 –
unsigned int result =(T1High << 22 | T1Low >> 10) – KonstantinL
http://stackoverflow.com/questions/5284898/implement-division-with-bit-wise-operator – aicastell