我是靠谱客的博主 搞怪魔镜,最近开发中收集的这篇文章主要介绍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

最后

以上就是搞怪魔镜为你收集整理的C/C++ 移位计算代替乘除运算的全部内容,希望文章能够帮你解决C/C++ 移位计算代替乘除运算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部