簡體   English   中英

如何使具有多個條件的if語句更短?

[英]Way to make this if statement with multiple conditions shorter?

我正在尋找一種使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
}

看來您只想檢查ij是否均為n-1n-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) {
   // ...
}

為了使布爾條件為真, i-(n-1)j-(n-1)0x1的按位OR0x1 因此,很明顯(i-(n-1)) | (j-(n-1)) (i-(n-1)) | (j-(n-1))必須為0x00x1 正如我假設ijint s時,被存儲在2位補碼,因此-1表示為0xffffffff00x010x1等等。 如果(i-(n-1)) | (j-(n-1)) (i-(n-1)) | (j-(n-1))0x10x0 i-(n-1)j-(n-1)需要為0x10x0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM