測試移位和乘除的比較,發現移位比乘除運算快一個位數的速度,但是難點在於判斷是否是2的冪次級的數,如果不是還得通過代碼拆分到2的冪次+上分子的累和,然后通過移位得到2的次冪數這樣;
下列代碼只是簡單的判斷是冪級數則移位運算,不是則正常計算,不是完全都是移位算,(之后如果找到方法判斷更快在更新)
C/C++:
1 #include <iostream> 2 3 4 5 uint64_t Multiply_Dived(uint64_t member, uint64_t denominator, char style) 6 { 7 //判斷分母是否是2的次冪 8 if (denominator & (denominator - 1)) 9 { 10 if (style == '*') 11 { 12 while ((denominator >>= 1) != 1) 13 { 14 member <<= 1; 15 } 16 17 } else 18 { 19 while ((denominator >>= 1) != 1) 20 { 21 member >>= 1; 22 } 23 24 } 25 return member; 26 } 27 28 if (style == '*') 29 { 30 return member * denominator; 31 } else 32 { 33 return member / denominator; 34 } 35 } 36 37 uint64_t Nomorl(uint64_t member, uint64_t denominator, char style) 38 { 39 if (style == '*') 40 { 41 return member * denominator; 42 } else 43 { 44 return member / denominator; 45 } 46 } 47 48 49 int main() 50 { 51 std::clock_t start = 0, stop = 0; 52 start = clock(); 53 for (uint64_t i = 0; i < 100000000; i++) 54 { 55 Multiply_Dived(1, 100, '/'); 56 } 57 stop = clock(); 58 std::cout << "除移位運行時間: " << ((double) (stop - start) / CLOCKS_PER_SEC) << std::endl; 59 60 61 62 63 start = clock(); 64 for (uint64_t i = 0; i < 100000000; i++) 65 { 66 Nomorl(1, 100, '/'); 67 } 68 stop = clock(); 69 std::cout << "正常除運行時間: " << ((double) (stop - start) / CLOCKS_PER_SEC) << std::endl; 70 71 return 0; 72 }