2

a,b为具有不同值的正整数。有什么方法可以简化这些表达式:

bool foo(unsigned a, unsigned b)
{
    if (a % 2 == 0)
      return (b % 2) ^ (a < b); // Should I write "!=" instead of "^" ?
    else      
      return ! ( (b % 2) ^ (a < b) ); // Should I write "(b % 2) == (a < b)"? 
}

我将返回的值解释为布尔值。

4

5 回答 5

5

它与

 (a%2)^(b%2)^(a<b)

这又是

 ((a^b)&1)^(a<b)

或者,确实

 ((a ^ b) & 1) != (a < b)

编辑补充:再想一想,这只是第一个和最后一个位的异或(a-b)(如果你使用 2 的补码),所以可能有一个机器特定的 ASM 序列更快,涉及旋转指令。

于 2012-11-06T20:29:48.610 回答
2

根据经验,不要混合使用不同运算符系列的运算符。您将关系/布尔运算符与位运算符和常规算术混合在一起。

这就是我认为你正在尝试做的事情,我不确定,因为我不明白你的代码的目的:它既不可读也不自我解释。

bool result;
bool a_is_even = (a % 2) == 0;
bool b_is_even = (b % 2) == 0;

if (a_is_even == b_is_even) // both even or both odd
  result = a < b;
else
  result = a >= b;

return result;
于 2012-11-06T20:46:13.367 回答
1

如果您返回一个真值,一个布尔值,那么您提议的更改不会改变代码的语义。这是因为按位异或,在真值上下文中使用时,与!=.

在我看来,您提出的更改使代码更容易理解。为什么作者认为按位 XOR 是合适的,我很难理解。我猜有些人认为这种编码很聪明。我不。

如果你想知道两个版本的相对性能,写一个程序和时间的差异。如果你能测量它们之间的任何差异,我会感到惊讶。如果这些代码行是您的性能瓶颈,我同样会感到惊讶。

于 2012-11-06T20:30:36.210 回答
1

我用 C# 编程,但我会考虑这样的事情:

返回 (a % 2 == 0) && ((b % 2) ^ (a < b))

考虑到您的评论,'^' 等同于 '=='

于 2012-11-06T20:33:49.400 回答
0

由于有关此问题的信息不多,请尝试以下操作:

int temp = (b % 2) ^ (a < b);
if (a % 2 == 0)
  return temp;
else      
  return !temp;  

如果编译器还没有优化它,这应该是更少的代码。

于 2012-11-06T20:58:34.080 回答