使具有多个条件的 if 语句更短的方法
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) {
// ...
}
要使布尔条件为真,应0x1
i-(n-1)
、j-(n-1)
和0x1
的按位OR
。因此,很明显,(i-(n-1)) | (j-(n-1))
要么需要0x0
要么0x1
。正如我假设i
和j
是int
,存储在2位补码中,因此-1
表示为0xffffffff
,0
是0x0
的,1
是0x1
的,依此类推。如果(i-(n-1)) | (j-(n-1))
0x1
或0x0
则需要0x1
或0x0
i-(n-1)
和j-(n-1)
。
相关文章:
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- c++:定义if语句中的模板
- C++嵌套的 If 语句中,它无法按预期工作
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 需要有关此 if 语句的帮助
- 转换器练习:跳过 if 语句和 if 语句
- 避免在 C++ 中的 if 语句中递增
- 如果仍然不满足要求,如何使 if 语句重复?
- do while 循环中的 if 语句以 yes 或 no 结尾
- 为什么在此C++代码中触发此 if 语句?
- 如何基于平台在制作文件中制作if语句?
- 在 if 语句中使用 GetKeyState 时,它会跳过条件
- C++ If 语句,从其他语句重复