C++ 中的 ^(按位异或)与布尔

The ^ (bitwise XOR) in C++ with Boolean

我运行 完成了一次代码挑战。完成后,我查看了其他答案。我看到一个我很难理解的答案。

#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file
#include "catch.hpp"

bool willYou(bool young, bool beautiful, bool loved)
{
    return (young & beautiful) ^ loved;
}

TEST_CASE("willYou are computed", "[willYou]")
{
    REQUIRE(willYou(true, true, true) == false);
    REQUIRE(willYou(true, false, true) == true);
    REQUIRE(willYou(false, false, false) == false);
    REQUIRE(willYou(false, false, true) == true);
}

如果您需要为挑战提供的信息(我认为这里没有必要)就是这样。

Once Mary heard a famous song, and a line from it stuck in her head. That line was "Will you still love me when I'm no longer young and beautiful?". Mary believes that a person is loved if and only if he/she is both young and beautiful, but this is quite a depressing thought, so she wants to put her belief to the test.

Knowing whether a person is young, beautiful and loved, find out if they contradict Mary's belief.

A person contradicts Mary's belief if one of the following statements is true:

they are young and beautiful but not loved;
they are loved but not young or not beautiful.
Example

For young = true, beautiful = true, and loved = true, the output should be
willYou(young, beautiful, loved) = false.

Young and beautiful people are loved according to Mary's belief.

For young = true, beautiful = false, and loved = true, the output should be
willYou(young, beautiful, loved) = true.

Mary doesn't believe that not beautiful people can be loved.

Input/Output

[execution time limit] 0.5 seconds (cpp)

[input] boolean young

[input] boolean beautiful

[input] boolean loved

[output] boolean

true if the person contradicts Mary's belief, false otherwise.

我没能理解的是这里如何使用 ^ 运算符来获得所需的布尔结果?我使用 Catch2. From GeeksForGeeks 创建了这些测试,它只是说明...

The ^ (bitwise XOR) in C or C++ takes two numbers as operands and does XOR on every bit of two numbers. The result of XOR is 1 if the two bits are different.

嗯,很确定这里的 true 和 false 是 1 和 0。所以我假设在第一个测试用例中 return 是 1 或 true,但它是 false 还是 0?如果一切都是真的,那为什么是假的呢?我知道这个故事试图在这里解释这一点。但在故事中它说如果年轻漂亮,那么你就会被爱。我不确定我是否误解了该声明,或者它是否只是错误的解释(我开始认为它只是错误的)。无论如何,我需要帮助来更好地理解这个运算符并基本上掌握这一切的含义。我只是迷路了。

我想我明白你想问的问题了。我看到评论部分试图向您解释 XOR 的作用,这有点有趣。无论如何,

问题表明,玛丽的信念是:"if you are young and beautiful, you are loved"。我们的目标是反驳玛丽并向她表明,有时有人被爱但不具备这两种品质中的一种或两种品质,OR 如果有人 拥有那些品质却不被爱

简而言之,我们的目的是反驳她的信仰。

willYou()函数的输出是检查如果我们是否可以反驳玛丽。也许您可以通过考虑各种情况并为每个情况提供输出来解决这个问题。你问题中提到的解决方案是通用的。

XOR 运算符 returns 如果表达式中有奇数个 1,则为 1。 例如:

  1. if young = 1 and beautiful = 1, their AND is 1 and their XOR with loved = 1 is 0(i.e. false) and因此它与玛丽相矛盾。
  2. 如果 young = 0 且 beautiful = 1,则它们的 AND 为 0 并且它们与 loved = 1 的 XOR 为 1( true)并且因此它确实与玛丽相矛盾。

同理,其他情况也可以这样写。

解算器一定使用了异或的"passer/inverter" 属性。每当输出对 Mary 有利时,它就会颠倒答案以产生我们 false,这意味着我们不能反驳她。我认为说这只是某人提出的创造性解决方案而不是令人难以置信的问题会让我们的生活更轻松(在这里根本不想居高临下)。

使用 [in] 等式运算符('==' 作为 xnor,'!=' 作为 xor);

bool a,b;

...

bool c=a==b;//xnor

bool d=a!=b;//异或