【问题标题】:Bit operators C++位运算符 C++
【发布时间】:2020-12-13 17:22:55
【问题描述】:

有人可以向我解释一下这个功能是如何工作的吗?我理解第 5 行的 x 部分的最低设置,但我不明白赋值 result ^= 1; 在决定单词的奇偶校验时结果不应该计算 0 和 1 吗?

short Parity_of_word(unsigned long long x) {
    short result = 0;
    while(x) {
        result ^= 1;
        x &= (x-1);
    }
    return result;
}

【问题讨论】:

  • ^= 1 只是切换最低有效位。在这里,它的工作方式与您声明 bool result = false; 相同,并将 result ^= 1; 替换为 result = !result;
  • 它实际上确实通过 sustraction 和 & 删除它们来迭代 1 位,汉明码也有类似的方法(popcount,1 位的计数)。对于奇偶校验位,实际上有一种更快的方法。 ^=1 是 XoR 1
  • @galo2324 你明白吗!和 ^ 做吗?不假即真。 1 异或 1 = 0。
  • @galo2324 它总是错误的。它在 0, 1, 0, 1 ...false, true, false, true, ... 之间交替,您计算的每一位。
  • @galo2324 那将是 popcount,您将需要一个计数器。奇偶校验为 1 或 0,您不需要计数器。但是,如果您查看 wiki ,您会发现不使用额外标志并且通过 N 次操作更快的算法,它的工作方式是,奇偶校验位将是 x 中最不重要的位

标签: c++ bit-manipulation bitwise-xor


【解决方案1】:
result ^= 1;

在 0 和 1 之间反复更改 result。所以,问题是:这将完成多少次?

x&=(x-1);

是一种“从 x 中删除最后一位”的 hacky 方式。要看到它,想象 x 是

0101000110

删除一个即可:

0101000101

(最后的0都变成了1,第一个1变成了0)。一旦您将and 两个值放在一起:

0101000100

多田,少一个1。因此,while 循环的执行次数与x 中的1s 一样多。它会相应地翻转result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多