【问题标题】:bitParity checker - count how many 0's in a bit vector位奇偶校验检查器 - 计算位向量中有多少个 0
【发布时间】: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


    【解决方案1】:

    32位值的奇偶校验可以通过将所有位链接在一起来计算

    parity = bit0 ^ bit1 ^ bit2 ^ ... ^ bit31
    

    在 C 中,这可以表示为:

    int parity = x & 1;      // Isolate least significant bit of x
    parity ^= (x >> 1) & 1;  // Isolate second least significant bit of x
                             // and xor it together with the interim value
    
    // Same for shift amounts from 2 up to 30 here
    
    parity ^= (x >> 31) & 1;  // Isolate most significant bit of x
                             // and xor it together with the interim value
    

    这将是 31 次操作,应该在此处进行优化。为此,单个位不再是孤立的,而是一次尽可能多的:在行中

    x ^= x >> 16
    

    会发生以下情况:

    x before: | bit0         | bit1         |     | bit15
    x >> 16:  | bit16,       | bit17,       | ... | bit31
    ----------+--------------+--------------+-----+-------------
    x after:  | bit0 ^ bit16 | bit1 ^ bit17 | ... | bit15 ^ bit31
    

    x 的第 16 位到第 31 位保持不变,但在下面不需要它们。这只剩下现在要处理的所有位的一半:

    before: | bit0 ^ bit16                | ... | bit1 ^ bit23
    >> 8 :  | bit8 ^ bit24                | ... | bit7 ^ bit31
    --------+-----------------------------+-----+---------------------------
    after:  | bit0 ^ bit8 ^ bit16 ^ bit32 | ... | bit1 ^ bit7 ^bit23 ^ bit31
    

    与上一步相比,位 8 到 15 保持不变。写下其他三个步骤太混乱了。最后,寻找的值(奇偶校验)包含在x 的最低有效位中。其他位被删除

    x &= 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-29
      • 2013-06-25
      • 2013-03-13
      • 1970-01-01
      • 2015-04-04
      • 2015-06-05
      • 2019-05-31
      相关资源
      最近更新 更多