首页 > 代码库 > C/C++ 移位计算代替乘除运算
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 }
C/C++ 移位计算代替乘除运算
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。