2013-04-28 161 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