C++ 如何缩短具有多个条件的if语句?
我正在寻找一种方法,使这个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 } 看
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
。而且代码可读性较差,更容易出错。应该添加注释来解释测试。@Jarod42i=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
。而且代码可读性较差,更容易出错。应该添加注释来解释测试。@Jarod42i=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)