在信息论中,两个等长二进制字符串之间的汉明距离是两个字符串对应位置的不一样字符的个数。例如,1011101 与 1001001 之间的汉明距离是 2。java
汉明距离是以理查德·卫斯里·汉明的名字命名的,汉明在偏差检测与校订码的基础性论文中首次引入这个概念。在通讯中累计定长二进制字中发生翻转的错误数据位,因此它也被称为信号距离。汉明重量分析在包括信息论、编码理论、密码学等领域都有应用。它是用来衡量2个二进制码字之间的类似程度的。编码
实现:spa
public int hammingDistance(int x, int y) { int hamming = x ^ y; int cnt = 0; while(hamming > 0){ hamming = hamming & (hamming - 1); cnt++; } return cnt; }
异或知道是获取不一样的,若是不一样就是1,。code
接下来的循环体:字符串
首先要明白一个原理:若是一个数中只有一个1,那么将它减1后,原来1的位置变为0,比1所在位置低的位置所有变为1。class
比方说原来是1000,则1000-1=0111,这样,1000&0111=0。基础
若是有多个1,则高位1是不会变的。好比111000-1=110111。高位的11没有动,只有低4位的1000变成了0111.原理
因此hamming & (hamming - 1)的意思就是将最低位的1置0.循环