如何使用多个条件的if语句更短?

时间:2015-07-14 09:32:51

标签: c++ performance if-statement

我正在寻找一种方法来使这个if语句更有效或至少更短。我在想,ij必须是(n - 1),或两者都是(n - 2)

if ((i == (n - 1) && j == (n - 1)) ||
    (i == (n - 1) && j == (n - 2)) ||
    (i == (n - 2) && j == (n - 1)) ||
    (i == (n - 2) && j == (n - 2)))
{
  // Code
}

4 个答案:

答案 0 :(得分:5)

您似乎只想检查ijn-1还是n-2

if ((i == (n - 1) || i == (n - 2)) &&
    (j == (n - 1) || j == (n - 2))
{
    //...
}

答案 1 :(得分:1)

if ((i == (n - 1) || i == (n - 2)) && (j == (n - 1) || j == (n - 2))
{
  // Code
}

答案 2 :(得分:1)

而更简单,更易读的是

(i == (n - 1) || i == (n - 2)) && (j == (n - 1) || j == (n - 2))

通过一些技巧,我们可能会删除一些分支(但可读性差)

(i == (n - 1) || i == (n - 2))

相当于

(i - (n - 2) == (n - 1) - (n - 2) || i - (n - 2) == 0)

(i - (n - 2) == 0 || i - (n - 2) == 1)

可以写成以下任何一种:

  • unsigned(i - (n - 2)) < 2
  • ((i - (n - 2)) & ~0x1) == 0
  • ((i - (n - 2)) | 0x1) == 0x1

最后,当对j(以及更多重构)做同样的事情时:

  • unsigned(i - (n - 2)) < 2 && unsigned(j - (n - 2)) < 2
  • (((i - (n - 2)) | (j - (n - 2))) & ~0x1) == 0
  • ((i - (n - 2)) | (j - (n - 2)) | 0x1) == 0x1

答案 3 :(得分:0)

if ((i-n+1)|(j-n+1)|0x1 == 0x1) {
   // ...
}

如果布尔条件为真,则ORi-(n-1)j-(n-1)的按位0x1应为0x1。因此,(i-(n-1)) | (j-(n-1))显然需要0x00x1。我假设ijint s,它们以2位补码存储,因此-1表示为0xffffffff,{{1} } 00x01,依此类推。如果0x1(i-(n-1)) | (j-(n-1))0x1,则0x0i-(n-1)必须为j-(n-1)0x1