【发布时间】:2020-07-08 10:20:12
【问题描述】:
我正在研究按位运算符和位操作,偶然发现了这个线程:bitParity - Finding odd number of bits in an integer
总而言之,用户请求了一个函数int bitParity(int x),如果传入的整数的二进制补码表示中有奇数个 0,则返回 1,否则,该函数返回 0。所有这些都有仅使用位运算符来完成。
我在尝试理解接受的响应时没有运气,并希望对此有所了解。
解决办法:
x ^= x >> 16
x ^= x >> 8
x ^= x >> 4
x ^= x >> 2
x ^= x >> 1
x &= 1;
据我所知,两个相同长度的连续子位向量之间的异或结果始终具有与原始位向量相同的 0 奇偶校验。因此,通过对位向量及其移位的计数器部分重复应用 XOR 运算符,直到达到长度为 1 的子位向量,您可以将结果链接到整个原始位向量。对我的想法和进一步解释的任何更正将不胜感激。
我对右移如何创建“子向量”感到困惑,因为x 是一个有符号值,这将是算术右移。我也不明白为什么两个子位向量网络之间的 XOR 将有奇数个 0,当且仅当原始有。
【问题讨论】:
标签: c bit-manipulation bitwise-operators bitwise-xor