`
aigo
  • 浏览: 2674541 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

为啥要用位运算代替取模呢

阅读更多

 

为什么很多开源软件中的源码中,使用位运算代替取模操作,比如:

a%b取模的形式都被替换成了a&(b-1) ,前提条件是:b为2的幂(乘方)

 

原因:

位运算实现取模只需5个CPU周期,而取模运算符实现至少需要26个CPU周期(注意,是最少!!!) 

 

原文:http://crazyjvm.iteye.com/blog/1725508

 

言归正传,大家都知道位运算的效率最高,这也是&取代%的原因,来看个程序:

C代码  收藏代码
  1. int main(int argc, char* argv[])  
  2. {  
  3.     int a = 0x111;  
  4.     int b = 0x222;  
  5.     int c = 0;  
  6.     int d = 0;  
  7.   
  8.     c = a & (b-1);  
  9.     d = a % b;  
  10.   
  11.     return 0;  
  12. }  

 

看反汇编的结果:

反汇编代码  收藏代码
  1. 13:       c = a & (b-1);  
  2. 00401044   mov         eax,dword ptr [ebp-8]  
  3. 00401047   sub         eax,1  
  4. 0040104A   mov         ecx,dword ptr [ebp-4]  
  5. 0040104D   and         ecx,eax  
  6. 0040104F   mov         dword ptr [ebp-0Ch],ecx  
  7. 14:       d = a % b;  
  8. 00401052   mov         eax,dword ptr [ebp-4]  
  9. 00401055   cdq  
  10. 00401056   idiv        eax,dword ptr [ebp-8]  
  11. 00401059   mov         dword ptr [ebp-10h],edx  

 

可以看到,&操作用了:3mov+1and+1sub  %操作用了:2mov+1cdp+1idiv

 

我们可以查阅Coding_ASM_-_Intel_Instruction_Set_Codes_and_Cycles资料,发现前者只需5个CPU周期,而后者至少需要26个CPU周期(注意,是最少!!!) 效率显而易见。所以以后自己在写的时候,也可以使用前者的写法。

 

分享到:
评论

相关推荐

    位运算.pdf 精心收集的资料,重新编辑

    - 对2的倍数取模:`a & (n-1)`可以代替`a % n`,对于n为2的幂次方特别有效。 - 越界判断:如`a & ~((1 )-1)`可以判断a是否在0到65535之间。 2. 位运算符介绍: - `&`(与运算):对应位都是1时结果为1,否则为0...

    [纯C语言 + Win32 API]一步一步写个围棋程序之十八:代码的改良

    在上面的例子中,我们利用位左移()来替代乘法,并且用按位与(&)和常量`wrap`来代替取模运算,这样就减少了CPU的运算负担。 在实际编程过程中,我们还需要考虑代码的可读性和维护性。虽然位运算可以提高性能,但...

    21067010433-王珍-输出随机三位数-解题报告1

    然后,通过取模运算 `%` 和整除 `/` 来获取百位、十位和个位数字。最后,使用`System.out.println`打印出结果。 代码解释如下: - `Random sc=new Random();` 创建一个随机数生成器对象`sc`。 - `int number=sc....

    Python语言整数运算实现机制分析与性能评估.zip

    - 使用内置函数(如`pow()`)代替自定义的指数运算,因为它们通常经过优化。 - 在需要高性能计算时,可以考虑使用NumPy等科学计算库,它们使用C扩展,性能更优。 综上所述,Python整数运算的实现机制是其动态特性...

    HashMap源码中的位运算符&详解

    在HashMap源码中,我们可以看到许多使用位运算符&代替取模运算符%的现象。那么,这是为什么呢?首先,我们需要了解取模运算符%的底层原理。取模运算符%实际上是除法器,a % b 等同于 a - a / b * b。这种运算方式的...

    斐波那契数列.rar

    斐波那契数列的几种时间复杂度优化 以下代码因不同算法而时间复杂度不同个人归类为不同版本,总结如下。 1.尽量不要用递归,纵使好看,但...4.用位运算来代替乘法、除法以及取模。 5.有数学公式用数学公式@.@....

    C语言如何将int转byte类型

    在C语言中,数据类型是...在进行类型转换时,要确保 `int` 值在适当的范围内,或者使用适当的位运算和取模运算来处理溢出和负数。在实际编程中,应该根据具体需求选择合适的方法,并进行充分的测试以确保转换的正确性。

    Url消重算法(BloomFilter)

    本程序主要是BloomFilter算法的简化实现 因为C#非安全代码无法直接分配内存块,使用了int型数组代替,暂时为了简单没有使用位运算,比位运算消耗内存多16倍。 算法原理: 其首先申请一块大内存,并把内存中...

    MATLAB中mod函数转化为C语言,有项目算法使用matlab中mod函数进行运算,这里需要将转化为C语言,从而模拟算法运行

    在MATLAB中,`mod`函数是一个非常常用的数学运算符,用于执行取模运算,即求两个数值相除后的余数。在C语言中,我们可以使用 `%` 运算符来实现相同的功能。以下是关于MATLAB `mod`函数转换为C语言的详细解释: ## ...

    编写单片机C语言代码的技巧和经验

    如果需要计算余数,可以使用与(&)操作符代替取模(%)操作符。 5. 优化循环和延时函数:循环是程序中常见的结构,应尽量减少循环的次数和复杂度。例如,在for循环中,将操作移至循环外部执行,减少每次循环中的...

    C语言代码优化11种实用方法.pdf

    - **位操作优化**:位操作(如按位与`&`)通常比算术运算(如取模`%`)更快。例如,用`a=a&7`替换`a=a%8`,对于要求2的幂次方的余数尤其有效。 - **避免浮点运算**:浮点数的运算通常比整数运算慢,因此应尽量避免...

    哈希表相关概念、hash函数、hash冲突解决方案、代码示例

    4. **位与法**:如果哈希表长度是2的幂,可以利用位运算代替取模,提高计算效率。例如,`Hash(K) = K & (length - 1)`。 5. **折叠法**:将键分割成若干等长或不等长的部分,将各部分相加得到哈希值。适合处理位数...

    c 高级技术 C语言代码优化方案

    在处理取模运算时,可以考虑使用位运算来进行优化,特别是当除数是2的幂次方时,使用位与操作代替取模运算会更加高效。 ### 总结 通过上述介绍可以看出,C语言代码优化涉及多个方面,包括但不限于选择合适的数据...

    ARM的除法运算优化策略

    例如,若需要频繁地进行n/d的运算,可以先计算s=(2^k-1)/d,然后通过2^k位乘法来代替k位无符号整数除法。这种方法特别适用于同一个除数的重复运算,如3D坐标变换中的归一化操作。此外,避免浮点除法,使用整数运算,...

    dsp中c代码优化

    - **移位运算代替乘除法**:对于乘以或除以2的幂次,使用移位操作(`和`>>`)可以显著提高速度,如`a=a代替`a=a*4`,`b=b>>2`代替`b=b/4`。 4. **其他优化技巧**: - **避免冗余计算**:重复计算相同的表达式会...

    JAVA解惑(JAVA谜题) 中文版(PDF)

    此外,在性能敏感的应用场景中,可以使用位操作符`&`代替取模运算: ```java public static boolean isOdd(int i) { return (i & 1) != 0; } ``` 这样做的好处是提高了运算效率。 #### 谜题2:找零问题 第二个谜题...

    javascript文档

    &= 运算符 对变量和表达式执行按位“与”运算,结果赋给变量。 && 运算符 对两个表达式执行逻辑连接运算。 * 运算符 将两个表达式的值相乘。 *= 运算符 将变量与表达式的值相乘,结果赋给变量。 + 运算符 将两个...

    节 数 据 运 算c语言PPT学习教案.pptx

    这些操作通常用于低级别编程,如设备驱动程序和内存管理,甚至可以用位移来代替乘除运算,提高效率。 7. **数学函数**:通过包含`<math.h>`头文件,C语言提供了丰富的数学函数,如正弦(sin), 余弦(cos), 正切(tan)...

    实验1 原码除法器设计1

    在设计过程中,禁止直接使用Verilog中的除法和取模运算符,而是要利用恢复余数算法或加减交替算法来实现。 **原码除法原理**: 原码除法中,符号位是独立处理的。假设被除数为[x]原,除数为[y]原,它们的绝对值分别...

Global site tag (gtag.js) - Google Analytics