zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    jquery 学习(五)
    iOS: 学习笔记, Swift名字空间
    iOS: 学习笔记, Swift与C指针交互(译)
    iOS: 学习笔记, Swift运算符定义
    iOS: 学习笔记, Swift与Objective-C混用总结
    iOS: 学习笔记, Swift与Objective-C混用简明教程(转载)
    股票查询接口: 腾讯
    iOS: 学习笔记, swift扩展
    iOS:Swift界面实例1, 简单界面
    iOS: 学习笔记, 用代码驱动自动布局实例(swift)
  • 原文地址:https://www.cnblogs.com/xuaidongstdudyrecording/p/7103733.html
Copyright © 2011-2022 走看看