使具有多个条件的 if 语句更短的方法

Way to make this if statement with multiple conditions shorter?

本文关键字:if 语句 方法 条件      更新时间:2023-10-16

我正在寻找一种方法来使这个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
}

看起来您只想检查ijn-1还是n-2

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

而更简单、更具可读性的是

(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
if ((i-n+1)|(j-n+1)|0x1 == 0x1) {
   // ...
}

要使布尔条件为真,应0x1 i-(n-1)j-(n-1)0x1的按位OR。因此,很明显,(i-(n-1)) | (j-(n-1))要么需要0x0要么0x1。正如我假设ijint,存储在2位补码中,因此-1表示为0xffffffff00x0的,10x1的,依此类推。如果(i-(n-1)) | (j-(n-1)) 0x10x0则需要0x10x0 i-(n-1)j-(n-1)