[英]Way to make this if statement with multiple conditions shorter?
我正在尋找一種使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))
{
//...
}
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
的按位OR
為0x1
。 因此,很明顯(i-(n-1)) | (j-(n-1))
(i-(n-1)) | (j-(n-1))
必須為0x0
或0x1
。 正如我假設i
和j
是int
s時,被存儲在2位補碼,因此-1
表示為0xffffffff
, 0
是0x0
和1
是0x1
等等。 如果(i-(n-1)) | (j-(n-1))
(i-(n-1)) | (j-(n-1))
為0x1
或0x0
i-(n-1)
和j-(n-1)
需要為0x1
或0x0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.