我正在寻找一种方法来使这个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
}
答案 0 :(得分:5)
您似乎只想检查i
和j
是n-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) {
// ...
}
如果布尔条件为真,则OR
,i-(n-1)
和j-(n-1)
的按位0x1
应为0x1
。因此,(i-(n-1)) | (j-(n-1))
显然需要0x0
或0x1
。我假设i
和j
是int
s,它们以2位补码存储,因此-1
表示为0xffffffff
,{{1} } 0
和0x0
是1
,依此类推。如果0x1
为(i-(n-1)) | (j-(n-1))
或0x1
,则0x0
和i-(n-1)
必须为j-(n-1)
或0x1
。