我在這裏有一個小型「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