C 奇偶校验如何找到偶数或奇数1';有点吗?
我想知道第1位的数字是奇数还是偶数。 代码如下:C 奇偶校验如何找到偶数或奇数1';有点吗?,c,bit-manipulation,C,Bit Manipulation,我想知道第1位的数字是奇数还是偶数。 代码如下: int odd_ones(unsigned x) { x ^= x >> 16; x ^= x >> 8; x ^= x >> 4; x ^= x >> 2; x ^= x >> 1; return !(x&1); } 但我不知道它是如何工作的;我在这方面已经坚持了很长时间。试着在做了x^=x>>16之后证明这一点x的最后16位
int odd_ones(unsigned x)
{
x ^= x >> 16;
x ^= x >> 8;
x ^= x >> 4;
x ^= x >> 2;
x ^= x >> 1;
return !(x&1);
}
但我不知道它是如何工作的;我在这方面已经坚持了很长时间。试着在做了
x^=x>>16之后证明这一点
x的最后16位将具有与原始值x
相同的1
s奇偶校验(假设x为32位)。然后在执行x^=x>>8之后
x的最后8位将具有与操作前x的最后16位相同的1
-s奇偶校验。通常,当您执行x^=x>>L
时,结果的最后L
位将具有与原始值x的最后2*L
位中1
s的奇偶校验相同的1
s奇偶校验 试着证明在做了x^=x>>16
x的最后16位将具有与原始值x
相同的1
s奇偶校验(假设x为32位)。然后在执行x^=x>>8之后
x的最后8位将具有与操作前x的最后16位相同的1
-s奇偶校验。通常,当您执行x^=x>>L
时,结果的最后L
位将具有与原始值x的最后2*L
位中1
s的奇偶校验相同的1
s奇偶校验 下面是8位奇偶校验发生器的电路图您的代码尝试将此组合电路实现为顺序逻辑(32位)。
想象一下这个电路的工作情况将有助于您理解代码 上述电路(即8位电路)的等效代码为:
int odd_ones(unsigned x)
{
x ^= x >> 1;
x ^= x >> 2;
x ^= x >> 4;
return !(x&1);
}
图像以下是8位奇偶校验发生器的电路图
您的代码尝试将此组合电路实现为顺序逻辑(32位)。
想象一下这个电路的工作情况将有助于您理解代码 上述电路(即8位电路)的等效代码为:
int odd_ones(unsigned x)
{
x ^= x >> 1;
x ^= x >> 2;
x ^= x >> 4;
return !(x&1);
}
图像礼貌你知道什么是
>
,&
和^
吗?如果没有,这就是为什么你没有得到它,如果是,告诉我们你卡在哪里。>>代表正确的衬衫和^代表XOR。我在“位表示”下写下了所有内容,它给出了真实的答案,但我不知道它如何给出它???odd\u one()
返回与我期望的函数相反的值,例如:odd\u one(0)
-->1和odd\u one(1)
-->0。我想把这个函数重命名为偶数奇偶校验()。你知道>
、&
和^
是什么吗?如果没有,这就是为什么你没有得到它,如果是,告诉我们你卡在哪里。>>代表正确的衬衫和^代表XOR。我在“位表示”下写下了所有内容,它给出了真实的答案,但我不知道它如何给出它???odd\u one()
返回与我期望的函数相反的值,例如:odd\u one(0)
-->1和odd\u one(1)
-->0。我想重命名这个函数is_even_parity()
。现在我了解了一点,但我如何证明在执行x^=x>>L之后,结果的最后L位将具有与最后2*L中的1s奇偶校验相同的1s奇偶校验?这是一个很好的位操作练习。如果我给你答案,对你没有好处。好吧,这是CSAPP的,这次我会想得更仔细。感谢您的帮助,因为1^1=0,所以当我在x^=x>>L中使用XOR时,它只需删除位1的2*i编号。这就是为什么最后的L位具有与x相同的奇偶校验。现在我了解了一点,但我如何证明在执行x^=x>>L之后,结果的最后L位将具有与最后2*L中的1s奇偶校验相同的1s奇偶校验?这是一个很好的位操作练习。如果我给你答案,对你没有好处。好吧,这是CSAPP的,这次我会想得更仔细。感谢您的帮助,因为1^1=0,所以当我在x^=x>>L中使用XOR时,它只需删除位1的2*i编号。这就是为什么最后的L位具有相同的x奇偶校验。