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

取两个字段的 XOR 并对结果进行人口计数。

于 2009-10-01T07:45:05.580 回答
5

如果将 2 个值异或在一起,则只剩下不同的位。

然后,您只需要计算仍然为 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 来确定有什么不同,然后使用其中一种算法来计算

于 2009-10-01T07:49:51.203 回答
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

对数字进行异或运算,那么问题就变成了计算结果中的 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 回答