布尔运算相关

Related to boolean operations

我遇到过以下代码:

const bool isIntersect = ...;
const bool isReversed = ...
if(!isIntersect != isReversed) {
  //some stuff
}

这对我来说很奇怪。问题是可以用更清楚的方式写吗: 所以它似乎不像 !isIntersect || isIntersect 也不像 !isIntersect && isIntersect.

if(isIntersect == isReversed) {

应该是一样的

要在没有(不)等式运算符的情况下表示它,您需要 XOR 的否定,

if(!(isIntersect ^ isReversed)) {

但这还不够清楚。

画个真相table:

isIntersect isReversed outcome
      false      false    true
      false       true   false
       true      false   false 
       true       true    true

如我们所见,这只是一个等价:

isIntersect == isReversed

所以可以把代码简化成

if (isIntersect == isReversed) {
  // some stuff
}

以下是四种结果情景:

场景一

const bool isIntersect = true;
const bool isReversed = true;
if(!isIntersect != isReversed) {
  // DOES RUN => ((!true) != true) => (false != true) => true
}

场景二

const bool isIntersect = true;
const bool isReversed = false;
if(!isIntersect != isReversed) {
  // DOES NOT RUN => ((!true) != false) => (false != false) => false
}

场景三

const bool isIntersect = false;
const bool isReversed = true;
if(!isIntersect != isReversed) {
  // DOES NOT RUN => ((!false) != true) => (true != true) => false
}

场景四

const bool isIntersect = false;
const bool isReversed = false;
if(!isIntersect != isReversed) {
  // DOES RUN => ((!false) != false) => (true != false) => true
}

这给了我们以下真相table:

isIntersect   isReversed   outcome
==================================
      false        false      true
      false         true     false
       true        false     false
       true         true      true

因此上述if-statement中的代码要么运行:

  • 如果 isIntersectisReversed 都是 true

  • 如果 isIntersectisReversed 都是 false

可以这样理解:

if((isIntersect && isReversed) || (!isIntersect && !isReversed)) { ... }

使用德摩根定理简化:

if((isIntersect && isReversed) || !(isIntersect || isReversed)) { ... }
// May be more difficult to understand it this way

最简单的形式语句:

if (isIntersect == isReversed) { ... }

该测试正在测试 isIntersectedisReversed 是否都为真或均为假,因此更详细(但可能更容易理解)的测试方法是

if ((isIntersected && isReversed) || (!isIntersected && !isReversed))