是否有任何理由使用 (nr & 1 == 0) 而不是 (nr % 2 == 0) 来检查奇偶校验?

Posted

技术标签:

【中文标题】是否有任何理由使用 (nr & 1 == 0) 而不是 (nr % 2 == 0) 来检查奇偶校验?【英文标题】:Is there any reason to use (nr & 1 == 0) over (nr % 2 == 0) to check for parity? 【发布时间】:2017-05-15 02:30:54 【问题描述】:

在性能上有什么实际差异吗? 它更快吗? (假设我在同一个程序中至少使用了 100 次,它会在速度方面提高我的程序吗?)

【问题讨论】:

你可以创建一个性能测试:) nr 总是积极的吗? @apandit 可以有任何符号。 直观地,模数需要一个比按位更复杂的除法运算,因此模数应该更慢。正如@KevinWallis 所说,您可以创建性能测试。 语言标签可能会有所帮助。语言是否具有符号类型、运算符重载或编译器(或生成的字节码,对于 IL 语言)可能优化的问题肯定是相关的。否则,问题就太宽泛了。 【参考方案1】:

这个问题可能更适合Software Engineering Stack Exchange。

如果您使用优化编译器,任何形式的n % <power of two> 都将优化为n & <power of two minus one>,因为它们是等价的,但在我能想到的几乎所有架构上,后者效率更高。

前一种形式更清楚地表达了您的意图,尽管许多开发人员会将n & 1 视为n % 2 的“更快版本”。

【讨论】:

不知道“软件工程堆栈交换”,抱歉发错地方了,谢谢你的回答!

以上是关于是否有任何理由使用 (nr & 1 == 0) 而不是 (nr % 2 == 0) 来检查奇偶校验?的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何理由使用一个 DataContext 实例,而不是几个?

是否有任何理由对同一资源使用“Vary: *”和“Vary: Foo”响应?

是否有任何理由使用右值引用重载运算符?

是否有任何陷阱或充分的理由不使用 autosproc 进行存储过程调用?

是否有理由不在mysql中使用<=>(空安全等于运算符)而不是=?

是否有任何实际理由为 JSON 键使用带引号的字符串?