我有一個嵌入式的16位CPU。在這臺機器上,整數是16位寬,它支持32位寬的長整數。我需要做一些乘法運算,這些乘法運算需要存儲在64位中(例如,將一個32位數乘以16位數)。我怎麼能用給定的約束來做到這一點?我沒有一個數學圖書館來做到這一點。如何在16位機器上執行64位乘法?
1
A
回答
3
C中的建議,請注意,這可能代碼會更容易與內聯彙編實現在C攜帶檢測似乎並不那麼容易
// Change the typedefs to what your compiler expects
typedef unsigned __int16 uint16 ;
typedef unsigned __int32 uint32 ;
// The 64bit int
typedef struct uint64__
{
uint32 lower ;
uint32 upper ;
} uint64;
typedef int boolt;
typedef struct addresult32__
{
uint32 result ;
boolt carry ;
} addresult32;
// Adds with carry. There doesn't seem to be
// a real good way to do this is in C so I
// cheated here. Typically in assembler one
// would detect the carry after the add operation
addresult32 add32(uint32 left, uint32 right)
{
unsigned __int64 res;
addresult32 result ;
res = left;
res += right;
result.result = res & 0xFFFFFFFF;
result.carry = (res - result.result) != 0;
return result;
}
// Multiplies two 32bit ints
uint64 multiply32(uint32 left, uint32 right)
{
uint32 lleft, uleft, lright, uright, a, b, c, d;
addresult32 sr1, sr2;
uint64 result;
// Make 16 bit integers but keep them in 32 bit integer
// to retain the higher bits
lleft = left & 0xFFFF;
lright = right & 0xFFFF;
uleft = (left >> 16) ;
uright = (right >> 16) ;
a = lleft * lright;
b = lleft * uright;
c = uleft * lright;
d = uleft * uright;
sr1 = add32(a, (b << 16));
sr2 = add32(sr1.result, (c << 16));
result.lower = sr2.result;
result.upper = d + (b >> 16) + (c >> 16);
if (sr1.carry)
{
++result.upper;
}
if (sr2.carry)
{
++result.upper;
}
return result;
}
2
你可能想看看Hacker's Delight(這是一個書和網站)。它們具有來自The Art of Computer Programming Vol.2的Knuth的signed multiword multiplication和unsigned multiword multiplication的C實現。
相關問題
- 1. 需要在32位長的機器上執行64位乘法
- 2. 64位乘法器在Fpga
- 3. 在64位機器上調用64位Dephi DLL從C#在64位機器上
- 4. 如何在64位機器上執行powershell腳本?
- 5. 如何在64位機器上將64位C++程序編譯?
- 6. 如何在64位linux機器上運行32位matlab?
- 7. 在64位機器上生成32位
- 8. 16位數字乘法
- 9. 64位Windows上的16位程序集?
- 10. 如何運行64位機器上的32位API?
- 11. 如何在16位數字上執行按位運算(Arduino)
- 12. 64位機器上的strtok
- 13. 如何使64位機器上的ODP.NET 4.0(64位)工作在Windows 7上?
- 14. 64位機器上的SQL Server 2012 32位或64位?
- 15. 如何在64位機器上測試32位SSIS包?
- 16. 如何在64位機器上調試32位WCF服務?
- 17. 如何使用32位除法指令執行64位除法?
- 18. 有什麼辦法在32位計算機上執行64位程序?
- 19. 安裝在64位機器上的Enthought Canopy的64位問題
- 20. 在64位機器上的無符號128位除法
- 21. Microsoft SharePoint的64位DLL正在32位機器上運行
- 22. 防止在64位機器上運行32位安裝項目
- 23. 在64位機器上運行32位.NET應用程序
- 24. 在64位機器上運行32位二進制
- 25. 在java中的64位機器上運行32位dll
- 26. 我可以在32位機器上運行64位dll嗎?
- 27. 64位在32位機器上運行的組件COM +導出
- 28. 32位代碼在64位Linux機器上運行
- 29. 需要一種在64位機器上運行intel 16位MASM的方法,這可能嗎?
- 30. 如何在64位機器中保存8位bmp圖像?在32位機器上運行得很好
您需要一個數學庫來提供這種服務作爲函數調用。 – RenniePet
那麼......你沒有提供足夠的信息。你是用匯編語言還是C語言編寫這個程序?您將需要獲取或編寫自己的函數或執行乘法的子例程。嘗試谷歌搜索「微處理器數學庫的名稱」。如果可能,請打開源代碼,然後您可以看到源代碼的完成方式,如果您不想將整個程序庫包含在程序中,只需複製說明即可。 (這不是我的專業領域,從我做這種編程已有35年了,我很驚訝它仍然是必要的。) – RenniePet
如果您提供微處理器的名稱,而不是僅僅說「嵌入式16位cpu「。 – RenniePet