C++ 如何缩短具有多个条件的if语句?

C++ 如何缩短具有多个条件的if语句?,c++,performance,if-statement,C++,Performance,If Statement,我正在寻找一种方法,使这个if语句更有效或至少更短。我在想,I或j必须是(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 } 看

我正在寻找一种方法,使这个if语句更有效或至少更短。我在想,
I
j
必须是
(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
}

看起来您只是想检查
i
j
是否都是
n-1
n-2

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

看起来您只是想检查
i
j
是否都是
n-1
n-2

if ((i == (n - 1) || i == (n - 2)) &&
    (j == (n - 1) || j == (n - 2))
{
    //...
}
如果布尔条件为真,则
i-(n-1)
j-(n-1)
0x1
的按位
应为
0x1
。因此很明显,
(i-(n-1))|(j-(n-1))
需要是
0x0
0x1
。当我假设
I
j
int
s时,
-1
被表示为
0xffffff
0
0x0
1
0x1
等等。如果
(i-(n-1))|(j-(n-1))
0x1
0x0
i-(n-1)
j-(n-1)
都需要是
0x1
0x0


如果布尔条件为真,则
i-(n-1)
j-(n-1)
0x1
的按位
应为
0x1
。因此很明显,
(i-(n-1))|(j-(n-1))
需要是
0x0
0x1
。当我假设
I
j
int
s时,
-1
被表示为
0xffffff
0
0x0
1
0x1
等等。如果
(i-(n-1))|(j-(n-1))
0x1
0x0
,则
i-(n-1)
j-(n-1)
都需要是
0x1
0x0

,而更简单、更可读的是

(i == (n - 1) || i == (n - 2)) && (j == (n - 1) || j == (n - 2))
通过一些技巧,我们可以删除一些分支(但可读性不强)

相当于

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

可写成以下任何一种:

  • 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

    • 而更简单、可读性更强的是

      (i == (n - 1) || i == (n - 2)) && (j == (n - 1) || j == (n - 2))
      
      通过一些技巧,我们可以删除一些分支(但可读性不强)

      相当于

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

      可写成以下任何一种:

      • 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

      几乎,如果
      i==n-2
      ,我们有false(
      (-1)==0x1
      ),
      +1
      应该是
      +2
      。而且代码可读性较差,更容易出错。应该添加注释来解释测试。@Jarod42
      i=n-2
      表示
      (i-n+1)=-1=0xffffff
      (假设2位补码中有32位有符号整数)
      0xFFFFFF | x
      0xFFFFFF
      而不管
      x
      是什么,因此它不会是
      0x1
      。这就是我的观点:
      i==n-2&&j==n-2
      是OP的正确答案,但不是你的答案。(你的是
      i==n
      i==n-1
      )@Jarod42这是一个位运算符而不是布尔运算符。几乎,如果
      i==n-2
      ,我们有false(
      (.1)=0x1
      ),那么
      +1
      应该是
      +2
      。而且代码可读性较差,更容易出错。应该添加注释来解释测试。@Jarod42
      i=n-2
      表示
      (i-n+1)=-1=0xffffff
      (假设2位补码中有32位有符号整数)
      0xFFFFFF | x
      0xFFFFFF
      而不管
      x
      是什么,因此它不会是
      0x1
      。这就是我的观点:
      i==n-2&&j==n-2
      是OP的正确答案,但不是你的答案。(您的是
      i==n
      i==n-1
      )@Jarod42,它是位运算符而不是布尔运算符。
      (i - (n - 2) == 0 || i - (n - 2) == 1)