許多CPU有用於返回一個32位整數乘法的高序位單一組件操作碼。正常情況下,將兩個32位整數相乘會產生一個64位結果,但如果將其存儲在32位整數中,結果將被截斷爲低32位。乘法的高位比特的有效計算
例如,在PowerPC上,mulhw操作碼在一個時鐘內返回32位乘32位的64位結果的高32位。這正是我正在尋找的,但更便攜。在NVidia CUDA中有一個類似的操作碼umulhi()。
在C/C++,有返回32x32乘法的高位比特的有效方式? 目前我通過強制轉換爲64位,是這樣計算的:
unsigned int umulhi32(unsigned int x, unsigned int y)
{
unsigned long long xx=x;
xx*=y;
return (unsigned int)(xx>>32);
}
但是這是比普通的32乘32乘慢了11倍,因爲我使用的是大材小用64位數學甚至是乘法。
是否有計算的高位更快的方法?
這很明顯是而不是最好用BigInteger庫解決(這是過度殺傷,將有巨大的開銷)。
上證所似乎有PMULHUW,這是一個16x16-> 16位版本,但不是32x32-> 32位版本,就像我正在尋找。
是,幾乎所有的每個編譯我使用過將在-O2上執行此操作,如果不在-O1上。 – 2009-09-09 02:34:01