2013-04-28 128 views
1

我想在循环中使用奇偶校验函数来每隔一次发生一次事件。但是我发现观看比价的所有功能都不起作用。十进制奇偶校验

即使是最简单的,就像这样:

unsigned int v;  
bool parity = false; 

while (v) 
{ 
    parity = !parity; 
    v = v & (v - 1); 
} 

能给我相同的值偶数和奇数。

如何做得很好?或者,也许还有其他方法可以让循环中的每一轮都发生一次事件吗?

+2

为什么一般情况下,偶数和奇数不具有相同的奇偶性? – 2013-04-28 02:04:16

+2

如果在'v'中设置了奇数位,则发布的循环会将'parity'设置为true - 如果'v'为奇数则不会。 – 2013-04-28 02:05:33

回答

8

看起来好像你误解了“平价”的含义,因为它通常在计算机世界中使用。你的代码已经证明套parityfalse如果v二进制表示有偶数个位集,并true如果有奇数个置位。奇偶校验的概念与v本身无关。一些例子:

Number (base 10)  Number (base 2)  Parity 
     0      0    0 
     1      1    1 
     2      10    1 
     3      11    0 
     4     100    1 
     5     101    0 
     6     110    0 
     7     111    1 
     .      .     . 
     .      .     . 
     .      .     . 
    12498741 1101 1110 1101 0111 0011 0101 0 
     .      .     . 
     .      .     . 
     .      .     . 

如果你确实想检查一个数字是偶数或奇数,你可以使用:

bool odd = v & 1; 
bool even = !(v & 1); 

,对等同于@ user1118321的答案使用的%表达。

+0

哦的确如此。我不知道。 – 2013-04-29 21:19:25

3

试试这个:

bool isEven = ((v % 2) == 0); 

这是假设v是要测试的均匀化的变量。这是modulo arithmetic

+0

完美的作品! 谢谢。 =) – 2013-04-28 01:57:33

+0

@ZoltánSchmidt太棒了!我看到你是新来的。一般来说,如果答案解决了问题,建议您检查旁边的绿色复选标记。 (但是不用担心,如果有更好的答案出现,你可以改变主意并选择不同的答案!) – user1118321 2013-04-28 02:10:39

+0

是的,我是新来的,但我很高兴能够很快得到答案。 – 2013-04-29 21:20:16