测试移位和乘除的比较,发现移位比乘除运算快一个位数的速度,但是难点在于判断是否是2的幂次级的数,如果不是还得通过代码拆分到2的幂次+上分子的累和,然后通过移位得到2的次幂数这样;
下列代码只是简单的判断是幂级数则移位运算,不是则正常计算,不是完全都是移位算,(之后如果找到方法判断更快在更新)
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
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/256187
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!