我的目标是取两个数字,看它们之间的位数差异。二进制分隔距离(Java)
例如:
号码A:01011 0111
数量B:11011 0101
这两个数之间的差异将是2,因为存在两个比特是不同的。有没有简单的方法来做这个计算,而没有制定一些大的算法来分解这两个数字?
我的目标是取两个数字,看它们之间的位数差异。二进制分隔距离(Java)
例如:
号码A:01011 0111
数量B:11011 0101
这两个数之间的差异将是2,因为存在两个比特是不同的。有没有简单的方法来做这个计算,而没有制定一些大的算法来分解这两个数字?
从0循环到要检查的位数(我将选择32),按当前“位索引”对两个数字进行位移,如果按位AND 1
(获取第一位)则递增差值计数,这两个数字是不同的。
public static int difference(int num1, int num2) {
int count = 0;
for (int i = 0; i < 32; i++) {
if (((num1 >> i) & 1) != ((num2 >> i) & 1)) count++;
}
return count;
}
实施例:
difference(0b010110111, 0b110110101); // result: 2
看取决于数据类型的位的数目:
long
- 64位int
- 32位short
- 16位byte
- 8位一个简单的实现对双方都是二进制数的每个字符转换为字符串和比较,像这样:
int count = 0;
for(int i = 0; i < String1.length() && i < String2.length(); i++)
{
if(String1.charAt(i) != String2.charAt(i))
count++;
}
这是我能想到的最简单的实现。
public static int difference(int num1, int num2) {
int count = 0;
int xor = num1^num2;
for (int i = 0; i < 32; i++) {
if ((xor >> i) & 1) count++;
}
return count;
}
这个版本从Hamming Distance Wikipedia article那儿剽窃:
public static int difference(int num1, int num2) {
int count = 0;
int xor = num1^num2;
while (xor != 0) {
count++;
xor &= xor - 1;
}
return count;
}
你并不需要一个 “大算法”,你可以只使用一个循环。 – 2014-11-22 18:53:31
你可能想Google“海明距离”。 – 2014-11-23 00:23:27
(您可以将两个数字XOR在一起,然后计算结果中的1位。) – 2014-11-23 00:24:47