首页 > 解决方案 > char = 0 在 C++ 中使用 XOR

问题描述

我正在用 C++ 练习字符串操作,发现这个例子找到了 2 个字符串之间的差异并返回该字符。这是那个代码。

#include <iostream>

char find_difference(const std::string& s, const std::string& t)
{
    std::string r = s + t;
    char ch = 0;
    for (char c : r) {
        ch ^= c;
    }
    return ch;
}

他们在这里使用 XOR,这在理论上是有意义的,但我对实现有点困惑。首先,这是什么意思?

char ch = 0;

我知道“^=”表示异或,但是如何用 char ch = 0 遍历字符串,给出准确的结果?

标签: c++string

解决方案


仅当有一个不同的字符时,您拥有的此实现才有效,否则两个字符串完全相同。它基于两个字符串相同但只有一个字符的假设,因此如果您将任何字符与自身进行异或,您将得到0(零),因此它们将所有字符异或在一起,相同的字符将自行抵消,剩下的唯一结果将是一个字符串中的不同字符和另一个字符串中的不同字符之间的异或。

它甚至可能不是一个可打印的字符,例如 'a' ^ 'b' 会给你 '\x01' 等等。所以我不太明白为什么有人会写这个愚蠢的代码,以及它可以用于什么目的。

还有什么... XOR 操作不关心顺序。如果你有字符串 'abc' 和 'cab' - 这个函数不会发现任何区别。


推荐阅读