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 }
原文地址:https://www.cnblogs.com/xuaidongstdudyrecording/p/7103733.html