【问题标题】:tracing through bitwise & and ^ in C通过 C 中的按位 & 和 ^ 进行跟踪
【发布时间】:2014-02-14 03:42:07
【问题描述】:

我一直在尝试跟踪某人为练习而编写的函数,但我似乎无法得到正确的答案。

bitParity - 如果 x 包含奇数个 0,则返回 1 示例:bitParity(5) = 0,bitParity(7) = 1

int bitParity(int x) {

x = (x >> 16) ^ x;
x = (x >> 8) ^ x;
x = (x >> 4) ^ x;
x = (x >> 2) ^ x;
x = (x >> 1) ^ x;
return x&1;
}

所以让我们以 5 为例。二进制中的 5 是 0101,有偶数个 0,所以应该返回 0。

因为 x>>2 之前的所有内容都会简单地返回 0101,所以我从行 x = (x>>2)^x

(x>>2) = 0001 

(x>>2) ^ x = 0001 XOR 0101 = 0100 

x 现在是 0100

然后我计算 x = (x>>1) ^ x

(x>>1) = 0010
(x>>1) ^ x = 0010 XOR 0100 = 0110

x 现在是 0110

然后我返回 (x&1),即 (0110 & 1111) = 0110

如果我正确理解所有内容,如果有偶数个 0,bitParity 应该返回全 0,例如 x = 5 这种情况。我做错了什么?

【问题讨论】:

  • 顺便说一句,大多数系统都有位计数指令,您的编译器可能会将其公开为“popcount”内在函数。

标签: c logic bit-manipulation


【解决方案1】:

一切都是正确的,直到最后一步 x & 1 解释是错误的。

根据您的示例x = 0110(在初始计算之后),1 表示为0000 0000 0000 0001(不是 1111)

所以x & 1

0110 
0001
----
0000
----

【讨论】:

    【解决方案2】:

    从概念上讲,该算法将每一步需要分析的位数减半。如果您有一个 32 位数字,则比较最高和最低 16 位。如果给定位置的两个位都设置为 1,则它们将奇偶校验位保持为零。只有当给定位置的位不同时,才需要进一步分析结果。这正是按位异或运算符的作用。

    一旦结果减少到一位,那一位就是答案。您分析的唯一错误是最后一步中的x & 10110 & 0001 == 0,而不是0110 & 1111 != 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多