【问题标题】:Which is the correct way to determine if two numbers have the same parity?确定两个数字是否具有相同奇偶性的正确方法是什么?
【发布时间】:2018-05-06 17:51:44
【问题描述】:

我找到了两种解决方案来确定两个数字是否具有相同的奇偶性(均为奇数或均为偶数)。在 C++ 中,它们看起来像这样:

if ((a+b)%2 == 0)

if (a%2 == b%2)

问题是第一个适用于 100% 的案例,而第二个仅适用于 80% 的案例(我在网站上提交的问题的测试),我不明白为什么。对我来说,两行代码都应该在所有情况下都能正常工作。有人可以解释一下为什么第一行代码在所有情况下都有效,而第二行则不行吗?您会推荐哪种方法(我或其他人展示的方法)?

【问题讨论】:

  • 你能提供一个 #2 不起作用的测试用例吗?
  • 我认为问题一定出在您尚未发布的代码中。请提供minimal reproducible example
  • 尝试使用负数和正/负混合。
  • 对。取负数的余数会得到什么结果?
  • 不。如果它是消极的或积极的,它在语言中是未指定的。在包括 x86 在内的许多硬件平台上,它将是一个负数。

标签: c++ numbers parity


【解决方案1】:

我不会推荐您帖子中的任何一种方法,您应该使用其中一种方法:

if ((a & 1) == (b & 1)) {} // this is clearer

if (((a ^ b) & 1) == 0) {} // this is faster

if (!((a ^ b) & 1)) {}     // this is as fast as faster

这些取决于位 0 将设置为奇数值,即使是负数。尽可能避免整数除法(和模),这是任何 CPU 上最慢的指令之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多