确定两个数字是否具有相同奇偶性的正确方法是什么?
Which is the correct way to determine if two numbers have the same parity?
我找到了两个解决方案来确定两个数字是否具有相同的奇偶性(均为奇数或均为偶数)。在 C++ 中,它们看起来像这样:
if ((a+b)%2 == 0)
和
if (a%2 == b%2)
问题是第一个适用于 100% 的案例,第二个仅适用于 80% 的案例(我在网站上提交的问题的测试),我不明白为什么。对我来说,这两行代码在所有情况下都可以正常工作。有人能解释一下为什么第一行代码在所有情况下都有效而第二行代码却不行吗?您会推荐哪种方法(我或其他人展示的方法)?
我不推荐您 post 中的任何一种方法,您应该改用其中一种方法:
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.
上最慢的指令之一
我找到了两个解决方案来确定两个数字是否具有相同的奇偶性(均为奇数或均为偶数)。在 C++ 中,它们看起来像这样:
if ((a+b)%2 == 0)
和
if (a%2 == b%2)
问题是第一个适用于 100% 的案例,第二个仅适用于 80% 的案例(我在网站上提交的问题的测试),我不明白为什么。对我来说,这两行代码在所有情况下都可以正常工作。有人能解释一下为什么第一行代码在所有情况下都有效而第二行代码却不行吗?您会推荐哪种方法(我或其他人展示的方法)?
我不推荐您 post 中的任何一种方法,您应该改用其中一种方法:
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.
上最慢的指令之一