真或假布尔表达式,什么时候放NOT操作符?



所以我被要求为-15和50之间的数字编码一个布尔表达式,其中它是而不是10到20之间的奇数

n = 21;
b1 = (n>=-15 && n<=50);
b2 = (n % 2 != 0) && (n>=10 && (n<=20));
result = b1 && !b2;

我不知道为什么我们不能把它写为布尔b2 = (n % 2==0) && (n>=10 && n<=20)。我有点糊涂了。有人能解释一下吗?

让我们使用if-else语句一步一步地执行

if ( n >= -15 && n <= 50 ) {
if ( n >= 10 && n <= 20 ) {
if ( n % 2 == 0 ) {
// true
}
} else { // = if ( n < 10 || n > 20 )
// true
}
}

等于:

b1 = (n >= -15 && n <= 50) && (n >= 10 && n <= 20) && (n % 2 == 0)
b2 = (n >= -15 && n <= 50) && (n < 10 || n > 20)
result = b1 || b2

现在您可以提取公共部分:

common = (n >= -15 && n <= 50)
b1 = common && (n >= 10 && n <= 20) && (n % 2 == 0)
b2 = common && (n < 10 || n > 20)
result = b1 || b2
// =>
common = (n >= -15 && n <= 50)
b1 = (n >= 10 && n <= 20) && (n % 2 == 0)
b2 = (n < 10 || n > 20)
result = common && (b1 || b2)

我们也知道b1b2不可能同时是true,因为它们的数字范围不重叠(b1在10到20之间,而b2是其他的一切)。尽管我们可以利用布尔或表达式的短路特性进一步缩短语句:

common = (n >= -15 && n <= 50)
b1 = (n % 2 == 0)
b2 = (n < 10 || n > 20)
result = common && (b2 || b1) // notice: b1 and b2 have been swapped

代码:

if (n >= -15 && n <= 50) {
if (n < 10 || n > 20) {
// true
} else {
// this will only happen if n is between -15 and 50, AND if n is NOT < 10 OR > 20
// in other words:  if n is between 10 and 20
if ( n % 2 == 0 ) {
// true
}
}
}

使用De Morgan定律,布尔或表达式变成如下:

( (n < 10 || n > 20) || (n % 2 == 0) )
// =>
! ( !(n < 10 || n > 20) && !(n % 2 == 0) ) 
// which can be transformed again using De Morgan's law =>
! ( (n >= 10 && n <= 20) && (n % 2 != 0) )

所以最终结果是:

common = (n >= -15 && n <= 50)
b1 = (n % 2 == 0)
b2 = (n < 10 || n > 20)
result = common && (b2 || b1)
result = (n >= -15 && n <= 50) && ((n < 10 || n > 20) || (n % 2 == 0))
// apply De Morgan's law =>
result = common && !(!b2 && !b1)
result = (n >= -15 && n <= 50) && !( (n >= 10 && n <= 20) && (n % 2 != 0) )

它有点像数学,但是有布尔值:布尔代数

最新更新