1

ループ内でパリティ チェック機能を使用して、1 秒おきに発生するイベントを作成したいと考えています。しかし、パリティを監視するために見つけたすべての機能は機能しません。

次のような最も単純なものでも:

unsigned int v;       
bool parity = false;  

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

偶数と奇数に同じ値を与えることができます。

うまくやるには?あるいは、ループの 2 ラウンドごとに発生するイベントを作成する他の方法はありますか?

4

2 に答える 2

8

コンピュータの世界で普通に使われている「パリティ」の意味を誤解しているようです。あなたが示したコードは、のバイナリ表現に偶数の設定ビットがある場合に設定parityし、奇数の設定ビットがある場合に設定します。パリティの概念は、偶数または奇数自体とは何の関係もありません。いくつかの例:falsevtruev

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の回答で使用されている式と同等です。

于 2013-04-28T02:12:07.540 に答える
3

これを試して:

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

vこれは、均一性をテストする変数であると想定しています。これはモジュロ算術です。

于 2013-04-28T01:47:35.850 に答える