4

数値のすべての偶数ビットまたは奇数ビットが1つだけに設定されているかどうかを確認したいと思います。例:

42バイナリコード101010では、すべてのビットと偶数ビットのみがに設定されているため、数値は正しい1です。番号21も正しいです、10101

例の番号691000101に設定された奇数ビットは3つしかないため、正しくありません1

でさまざまな操作を使用してみましたが^, &, >>, <<、これらの演算子を使用してこれを行う方法がまだわかりません。はい、で論理演算子を使用してこれを行う必要がありますC

4

3 に答える 3

5

これらの数値には、 2(x ^ (x >> 1)) + 1の累乗であるプロパティがあります。yy & (y - 1) == 0

したがって、1つのテストは((x ^ (x >> 1)) + 1) & (x ^ (x >> 1)) == 0、任意のサイズの数値に対して機能する可能性があります。

于 2012-10-13T19:28:07.393 に答える
3
#include <stdio.h>

int main(void)
{
    unsigned uu;

    for (uu=0; uu < 43; uu++ ) {
        int res;
        res = (((uu & 0xAAAAAAAA) == uu) || ((uu & 0x55555555) == uu) );
        printf("%u: %d\n", uu, res);
    }
    return 0;
}
于 2012-10-13T19:19:34.853 に答える
1
bool isEven(int n){
   bool isEven = true;
   while(n){
      if( n & 1 ){
          isEven = !isEven;
      }
      n = n >> 1;
   }

   return isEven;
}

while(n)は、nが!= 0である限り継続しますが、それでも1が含まれています。最初のビットが1の場合、偶数パラメーターを反対に変更し(偶数は奇数に、またはその逆になります)、反復ごとに数値を1ビット右にシフトします。

于 2012-10-13T19:15:00.653 に答える