【发布时间】: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