import java.lang.Math;
/**
* Desc: Hamming Distance 汉明距离
* 0.表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离
* 1.汉明距离是以理查德·卫斯里·汉明的名字命名的。
* 2.在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。
* 换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。
*/
class Solution {
public static void main(String[] args) {
int distance = hammingDistance(1577962638, 1727613287);
System.out.println(distance);
}
/**
* 表示两个字x,y之间的汉明距离。对两个字符串进行异或运算
* @param x
* @param y
* @return
*/
public static int hammingDistance(int x, int y) {
String bin_x = decimalToBinary(x);
String bin_y = decimalToBinary(y);
StringBuffer bin_z=new StringBuffer();
//对两个数的二进制进行异或运算(相同为0 相异为1)
int len = bin_x.length() > bin_y.length() ? bin_y.length() : bin_x.length();
for (int i = 0; i < len; i++) {
char r_x = bin_x.charAt(bin_x.length()-i-1);
char r_y = bin_y.charAt(bin_y.length()-i-1);
int r_z = r_x != r_y ? 1 : 0;
bin_z.insert(0,r_z);
}
String s=bin_x.length() > bin_y.length() ? bin_x: bin_y;
while(len<s.length()){
bin_z.insert(0,s.charAt(s.length()-len-1));
len++;
}
//统计结果为1的个数
int include = 0;
int t=0;
while (t < bin_z.length()) {
char r_z =bin_z.charAt(t);
if (r_z == '1') {
include++;
}
t++;
}
return include;
}
/**
* 十进制转二进制
* @param n
* @return
*/
public static String decimalToBinary(int n) {
//分析 10进制转二进制的过程
int r = 0;
StringBuffer bin =new StringBuffer();
int t = 0;
while (n != 0) {
r = n % 2;
n = n / 2;
bin.append(r);
t++;
}
return bin.reverse().toString();
}
}
【Hamming Distance】-1(Java)
于 2021-11-23 10:24:40 首次发布