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;

(类型tailuint8_t *
据我所见,这和手术没什么不同。在这里使用异或有什么区别?是优化吗?如果是的话,是什么样的?还是我遗漏了关于这两个操作员行为差异的一些东西?
我已经知道了xor和or之间的区别。但在这种情况下,由于值在开始时为零,且xored值不重叠,因此行为不应与或完全不同。所以我要问为什么作者选择了这个或(这比xor-imho更好地表达了它的意图)。

最佳答案

是的,在这种情况下,它们是完全等价的。此外,由于它们是等价的,编译器可以使用它自己进行优化。当您编译时,您将无法保证它实际上是或是xor-xor。实际上,在更一般的层面上,只要编译器生成的代码的可观察行为是相同的,就不能保证它会是其中的任何一个。
使用xor的一个合理理由是,它是所讨论的程序员首先想到的事情,或者代码最初是以重要的方式编写的,但后来改为无关紧要的版本。但由于它们在这种情况下是等价的,所以很难知道。

关于c - 为什么在OR上使用XOR?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53625122/

10-13 00:25