2

私がこのビットフィールド値を持っているとしましょう:10101001

n他の値がビットで異なるかどうかをどのようにテストしますか?ポジションを考慮せずに?

例:

10101001
10101011 --> 1 bit different 

10101001
10111001 --> 1 bit different

10101001
01101001 --> 2 bits different

10101001
00101011 --> 2 bits different

私はこの比較をたくさんする必要があるので、私は主にパフォーマンスを探していますが、どんなヒントも大歓迎です。

4

7 に答える 7

11

2つのフィールドのXORを取得し、結果の母集団カウントを実行します。

于 2009-10-01T07:45:05.580 に答える
5

2つの値をXORすると、異なるビットのみが残ります。

次に、まだ1であるビットを数えるだけで、答えが得られます。

cで:

 unsigned char val1=12;
 unsigned char val2=123;
 unsigned char xored = val1 ^ val2;
 int i;
 int numBits=0;
 for(i=0; i<8; i++)
 {
      if(xored&1) numBits++;
      xored>>=1;
 }

バイト内のビットをカウントするより高速な方法がおそらくありますが(たとえば、256個の値に対してルックアップテーブルを使用できます)

于 2009-10-01T07:45:30.777 に答える
4

他のみんなが言ったように、XORを使用して何が違うのかを判断し、これらのアルゴリズムの1つを使用してカウントします

于 2009-10-01T07:49:51.203 に答える
3

これにより、値間のビット差が取得され、一度に3ビットがカウントされます。

public static int BitDifference(int a, int b) {
   int cnt = 0, bits = a ^ b;
   while (bits != 0) {
      cnt += (0xE994 >> ((bits & 7) << 1)) & 3;
      bits >>= 3;
   }
   return cnt;
}
于 2009-10-01T08:17:36.187 に答える
1

数値をXORすると、問題は結果の1を数えることの問題になります。

于 2009-10-01T07:46:25.093 に答える
1

Javaの場合:

Integer.bitCount(a ^ b)
于 2009-10-01T11:22:39.480 に答える
0

他の人がすでに答えているように、比較はXORで実行されます。

カウントはいくつかの方法で実行できます。

  • 左にシフトして加算します。
  • テーブルでのルックアップ。
  • カルノー図で見つけることができる論理式。
于 2009-10-01T07:51:21.060 に答える