简化此表达式

时间:2012-11-06 20:23:16

标签: c++ c expression

ab为具有不同值的正整数。有没有办法简化这些表达式:

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)"? 
}

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

5 个答案:

答案 0 :(得分:5)

有什么不同
 (a%2)^(b%2)^(a<b)

反过来

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

或者确实

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

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

答案 1 :(得分: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;

答案 2 :(得分:1)

如果要返回真值,布尔值,则建议的更改不会更改代码的语义。这是因为在真实上下文中使用时,按位XOR与!=相同。

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

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

答案 3 :(得分:1)

我用C#编程,但我想到这样的事情:

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

从你的评论中考虑'^'相当于'=='

答案 4 :(得分:0)

由于此问题的信息不多,请尝试以下方法:

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

如果编译器尚未对其进行优化,那么这应该是更少的代码。