在C ++命令中是否正确
n& 1
更快,占用的内存少于
n%2?
(其中n的类型为int)
更全局,有没有办法比使用%运算符更快地找到模2的整数残差?提前谢谢。
答案 0 :(得分:5)
使用更多或更少的内存高度依赖于指令编码,但n & 1
可以快许多倍[1],如果编译器没有优化n % 2
同样的事情。当然,许多编译器确实会进行这种优化(或者可以做同样的事情,但应对对%
产生有趣影响的负数,&
不需要“关心”关于)。
请注意,根据您想要实现的目标,负数将需要特殊处理才能使用& 1
。如果从1
获取-1 & 1
是正常的,那么使用&
确实是一个有效选项,但在数学上有点奇怪。
另请注意,总是在比较性能时,您需要进行自己的基准测量[或者很好地理解特定编译器为特定处理器模型生成的内容],您不能总是依赖于您在互联网上阅读的内容 - 包括我的帖子。
[1]作为比较,大多数现代处理器在单个时钟周期内执行AND,并且通常可以并行执行多个这样的操作。用于余数的整数除法肯定不是那么快。我碰巧从2012年1月开始为“家庭15”处理器提供AMD优化指南。采用“余数”作为答案的32位除法运算最多可能需要39个时钟周期。因此,假设编译器没有将%
优化为AND指令,使用%
比使用&
差大约40-80倍 - 当然假设它是有效的优化。