使用与运算符代替求余运算符的技巧
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本文链接地址: 使用与运算符代替求余运算符的技巧
目测编译器不会放过该优化机会
这个编译器做不来,这个条件不是编译阶段可以决定的
我指的情况是“底数”是写在代码里的常量,此时,编译的时候,直接判断源文件中该常量是否为2的多少次幂即可,另一种情况是“底数”也是变量,那么如果要改成作者说的形式,是不是还得写段代码来判断这个变量是否为2的多少幂?增加了运算量不说,也使代码变得不便于阅读,所以我认为作者应该是指前一种情况
分析得不错,暂时还未知哪个编译器有这么一个编译器优化选项