C/C++ 移位計算代替乘除運算


測試移位和乘除的比較,發現移位比乘除運算快一個位數的速度,但是難點在於判斷是否是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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM