The C code of MurmurHash3有以下部分:
uint64_t k1 = 0;
uint64_t k2 = 0;
switch(len & 15)
{
case 15: k2 ^= ((uint64_t)tail[14]) << 48;
case 14: k2 ^= ((uint64_t)tail[13]) << 40;
case 13: k2 ^= ((uint64_t)tail[12]) << 32;
case 12: k2 ^= ((uint64_t)tail[11]) << 24;
case 11: k2 ^= ((uint64_t)tail[10]) << 16;
case 10: k2 ^= ((uint64_t)tail[ 9]) << 8;
case 9: k2 ^= ((uint64_t)tail[ 8]) << 0;
(类型
tail
是uint8_t *
)据我所见,这和手术没什么不同。在这里使用异或有什么区别?是优化吗?如果是的话,是什么样的?还是我遗漏了关于这两个操作员行为差异的一些东西?
我已经知道了xor和or之间的区别。但在这种情况下,由于值在开始时为零,且xored值不重叠,因此行为不应与或完全不同。所以我要问为什么作者选择了这个或(这比xor-imho更好地表达了它的意图)。
最佳答案
是的,在这种情况下,它们是完全等价的。此外,由于它们是等价的,编译器可以使用它自己进行优化。当您编译时,您将无法保证它实际上是或是xor-xor。实际上,在更一般的层面上,只要编译器生成的代码的可观察行为是相同的,就不能保证它会是其中的任何一个。
使用xor的一个合理理由是,它是所讨论的程序员首先想到的事情,或者代码最初是以重要的方式编写的,但后来改为无关紧要的版本。但由于它们在这种情况下是等价的,所以很难知道。
关于c - 为什么在OR上使用XOR?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53625122/