使用与运算符代替求余运算符的技巧

1.性能对比:

求余运算:a MOD b就相当与a-(a DIV b)*b 的运算。

与运算:就是一个指令的事

2.在特殊场景下,是否能用与&替代%呢?

在对10进行求余的时候,我们发现,余数总是整数中的个位上的数字,而不用管其他位是什么;在与运算中,我们经常需要使用位操作符&来取某些位上的值,例如使用0xff&0x17ae来获取低8位的值,现在我们已经发现有点关联了,如果求余结果值的范围刚好跟是[0,求余的底数(a%b中的b))集合一样,那么低位就是求余的结果。

[code]
23%16 == 7
23 (0x17)& 0x0F == 0x07
[/code]

所以,当需要对2的次幂进行求余时,可以是使用&运算符来代替,效率会倍儿棒。

当x=2^n(n为自然数)时,

[code]
a % x = a & (x  – 1 )
[/code]

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 使用与运算符代替求余运算符的技巧

  • Trackback 关闭
  • 评论 (4)
  1. 目测编译器不会放过该优化机会

      • wely
      • 2013/12/31 2:00下午

      这个编译器做不来,这个条件不是编译阶段可以决定的

      • 我指的情况是“底数”是写在代码里的常量,此时,编译的时候,直接判断源文件中该常量是否为2的多少次幂即可,另一种情况是“底数”也是变量,那么如果要改成作者说的形式,是不是还得写段代码来判断这个变量是否为2的多少幂?增加了运算量不说,也使代码变得不便于阅读,所以我认为作者应该是指前一种情况

        • wely
        • 2014/01/01 9:49上午

        分析得不错,暂时还未知哪个编译器有这么一个编译器优化选项

return top