XOR操作员 - 它是如何工作的?

Yai*_*vet 5 c# binary xor bitwise-operators

能否请您用简单的英语解释一下XOR(^)运算符及其在以下代码中的作用:

public int GetHashCode(Box bx)
{
    int hCode = bx.Height ^ bx.Length ^ bx.Width;
    return hCode.GetHashCode();
} 
Run Code Online (Sandbox Code Playgroud)

eva*_*nal 9

XOR代表独家或.它确保A或B是真的但不是两者都是.在这种情况下,我们正在做一个按位操作,所以你可以做一个很好的结果图,它们如下;

0 ^ 1 = 1
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 0 = 0
Run Code Online (Sandbox Code Playgroud)

由于您将其应用于整数,因此上述结果将应用于操作数中的每个位.所以我们假设你的高度,长度和宽度分别为1,2,3.

你会先拥有

0001 ^ 0010导致0011然后将XOR变为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
Run Code Online (Sandbox Code Playgroud)

所以拼凑起来,你得到了0011.基本上,取每对输入并参考结果的真值表.注释显示输出x为尚未计算的值.

关于碰撞,是的,在这种情况下有很多碰撞.如果我说它是独特的,这是一个糟糕的词选择.我真正的意思是,如果你有2个,8个,4个作为你的值,那么它们按顺序总是会产生相同的值.

  • @Groostav也进一步扩展,它在这里完成,因为'a ^ b ^ c`的结果对于那些值总是相同的.在获取哈希之前,他们基本上将所有值合并为一,以便哈希对于a,b和c的值是唯一的. (2认同)