c# - XOR 运算符 - 它是如何工作的?

标签 c# binary bitwise-operators xor

能否请您用简单的英语向我解释什么是 XOR (^) 运算符以及它在以下代码中的作用:

public int GetHashCode(Box bx)
{
    int hCode = bx.Height ^ bx.Length ^ bx.Width;
    return hCode.GetHashCode();
} 

最佳答案

XOR 代表异或。它确保 A 或 B 为真,但绝不会同时为真。在这种情况下,我们正在进行按位运算,因此您可以制作一个漂亮的结果小图,如下所示;

0 ^ 1 = 1
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 0 = 0

由于您将其应用于整数,因此上述结果将应用于操作数中的每一位。因此,假设您的高度、长度和宽度分别为 1、2、3。

你首先会拥有

0001 ^ 0010 得到 0011 然后将其异或为 3 所以 0011 ^ 0011 得到 0000

编辑:从评论中提供维基链接以补充我的解释; http://en.wikipedia.org/wiki/Exclusive_or#Computer_science

编辑:为什么 0001 ^ 0010 会导致 0011

所以最好一点一点地做。想想运算符迭代两组位并比较它们的对。所以在这种情况下,让我们从右到左工作(在这种情况下从最不重要到最重要)。

1 ^ 0 = 1 // xxx1
0 ^ 1 = 1 // xx11
0 ^ 0 = 0 // x011
0 ^ 0 = 0 // 0011  - end of input

因此,将其重新组合在一起,您将得到 0011。基本上,采用每对输入并引用结果的真值表。注释显示 x 的输出是一个尚未计算的值。

关于碰撞,是的,在这种情况下有很多碰撞。如果我说它是独一无二的,那是一个糟糕的词选择。我真正的意思是,如果您将 2、8、4 作为您的值,则按该顺序对它们进行异或运算将始终产生相同的值。

关于c# - XOR 运算符 - 它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18239755/

相关文章:

c# - 将 RDLC 渲染为 pdf 输出控制台应用程序

c# - 线程并行编程

javascript - 如何拆分和合并 RxJS 发出的数组值?

c# - 了解非 bool 参数之间的按位比较

c# - C# 如何评估数组循环 boolean 相等性?

c# - 如何从 Asp.Net Core 的 ConfigureServices 方法内部访问添加到 DI 容器的服务

c# - 弹出面板中的页面方法不会在 IE9 中第二次加载

algorithm - 在数学上如何将分类结果与聚类结果进行比较

php - 这段代码怎么会有错误呢?

c# - 如何将日期和时间打包成 32 位?