整数均匀度测试(%2 vs& 1)

时间:2011-06-23 06:42:27

标签: c

这两个语句是否等效编译:n%2 == 0和n& 1 == 0?

如果没有,是否更有效率?

6 个答案:

答案 0 :(得分:3)

这取决于你的编译器。

x86架构上的优化编译器可能会将n % 2转换为n & 1,因为它们与2s补码整数等效。同一平台上的不同编译器或不同平台上的相同编译器可能会为您提供其他结果。

我的建议是使用n % 2,因为这是您在数学术语中要完成的任务,并在开始微优化之前对您的应用进行概要分析。

答案 1 :(得分:3)

昨天有人问similar question

i % 2i & 1不一样:

  • 如果您的整数不是无符号的,则根据其表示形式,n & 1不一定表示您的整数是偶数还是奇数。
  • i % 2可能是否定的。

对于无符号整数,一个好的编译器应该合理地产生同样有效的代码。

答案 2 :(得分:2)

无论哪一个更快,并且它不太可能重要,n % 2 == 0是首选,因为它使你的意图清晰。选择它的原因与您希望将*2写入位移的原因相同。

答案 3 :(得分:2)

不,他们并不总是给出相同的结果。 C标准允许补偿实现,在这种情况下,它们将为负n提供不同的结果。

答案 4 :(得分:1)

他们不会等效编译。 (实际上我应该说取决于编译器。但更安全地假设编译会有所不同) (n& 1)是有效的。 (再次。不确定有关端语的东西,会检查并通知你。)
好的 - 检查了endian的东西。它与字节的顺序有关,而不是位的顺序。因此(n& 1)必须与平台无关。

答案 5 :(得分:0)

我用C ++编写了一个任意精度整数库。 %和&超负荷,以至于他们做了你真正想要的真正的大赌注。任意精度模数非常复杂,而任意精度位测试则不然。由于这种洞察力,我总是喜欢(n& 1)因为我知道幕后发生了什么。当然,你可以说智能编译器可能会优化(n%2)与(n& 1)相同的指令集,但你真正的意思是“我通过使用%并希望我的编译器更聪明我做错了比我。“忽略(n%2)更容易理解的评论。结果(n& 1)也很容易理解(好吧,也许不适合我的祖母)。使用&,这是正确的方法。