【问题标题】:Even parity of a unsigned int [duplicate]无符号整数的偶校验[重复]
【发布时间】:2014-03-02 14:49:05
【问题描述】:
/*A value has even parity if it has an even number of 1 bits.
 *A value has an odd parity if it has an odd number of 1 bits.
 *For example, 0110 has even parity, and 1110 has odd parity.
 *Return 1 iff x has even parity.
 */

int has_even_parity(unsigned int x) {

}

我不确定从哪里开始编写这个函数,我想我将值作为一个数组循环并对其应用异或操作。 会像以下工作吗?如果没有,有什么方法可以解决这个问题?

int has_even_parity(unsigned int x) {
    int i, result = x[0];
    for (i = 0; i < 3; i++){
        result = result ^ x[i + 1];
    }
    if (result == 0){
        return 1;
    }
    else{
        return 0;
    }
}

【问题讨论】:

标签: c bits parity


【解决方案1】:

您不能将整数作为数组访问,

unsigned x = ...;
// x[0]; doesn't work

但你可以使用按位运算。

unsigned x = ...;
int n = ...;
int bit = (x >> n) & 1u; // Extract bit n, where bit 0 is the LSB

有一个聪明的方法可以做到这一点,假设是 32 位整数:

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

【讨论】:

    【解决方案2】:

    选项 #1 - 以“明显”的方式迭代位,在 O(位数):

    int has_even_parity(unsigned int x)
    {
        int p = 1;
        while (x)
        {
            p ^= x&1;
            x >>= 1; // at each iteration, we shift the input one bit to the right
        }
        return p;
    

    选项 #2 - 仅迭代设置为 1 的位,时间为 O(1 的数量):

    int has_even_parity(unsigned int x)
    {
        int p = 1;
        while (x)
        {
            p ^= 1;
            x &= x-1; // at each iteration, we set the least significant 1 to 0
        }
        return p;
    }
    

    选项 #3 - 使用 SWAR 算法计算 1,时间为 O(log(位数)):

    http://aggregate.org/MAGIC/#Population%20Count%20%28Ones%20Count%29

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 2021-01-02
      相关资源
      最近更新 更多