c++ - 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 遍历字符串,给出准确的结果?
解决方案
仅当有一个不同的字符时,您拥有的此实现才有效,否则两个字符串完全相同。它基于两个字符串相同但只有一个字符的假设,因此如果您将任何字符与自身进行异或,您将得到0
(零),因此它们将所有字符异或在一起,相同的字符将自行抵消,剩下的唯一结果将是一个字符串中的不同字符和另一个字符串中的不同字符之间的异或。
它甚至可能不是一个可打印的字符,例如 'a' ^ 'b' 会给你 '\x01' 等等。所以我不太明白为什么有人会写这个愚蠢的代码,以及它可以用于什么目的。
还有什么... XOR 操作不关心顺序。如果你有字符串 'abc' 和 'cab' - 这个函数不会发现任何区别。
推荐阅读
- swift - 按下赞按钮后,如何在firebase中记录赞?
- html - 并非所有 div 都显示为全宽
- c++11 - 谁能告诉我 prim 函数的错误?
- python - 如何在 Python 中生成条件矩阵?
- azure - 如何在 Azure(VM、SQL db、自定义日志记录)中收集多个资源的日志记录 - 最佳方法?
- command-line - 如何使用 Cyrillic 字体列出文件夹的内容?
- javascript - 如何在 Matlab/Python/JS 中获取形状(/Body)的 X、Y(和 Z)坐标?
- cmake - 如何将没有价值的参数传递给 CMake?
- r - 这是 R 神经网络过拟合吗?
- c# - 特定字符之前的 C# 文本