求两个数的二进制位不一样的位置,最早想到的就是异或操做,ui
异或:按位运算,相同为0,不一样为1。code
好比:
a = 6 对应的二进制表示为: 0 0 1 1 1
b = 9 对应的二进制表示为: 0 1 0 0 1
则 a ^ b = 14 对应的二进制表示为: 0 1 1 1 0
因此,只要算出异或以后的数的二进制表示方法里面1的个数。
好比,对于上面的异或以后为14,14的二进制里面1的个数为3,那么汉明距离就是3。
想知道是否有1,最快的固然仍是位与操做,循环
与:按位运算,至关于乘法,0与0是0,1与0是0,0与1是0,1与1是1。二进制
因此,任何值与1相与,获得的就是就是原值二进制的最后一位,
要么是1,要么是0,
这样就能获得原值的最低位是不是1。
而后再把原值总体右移一位,再查看最低位是不是1,
循环往复,就可以算出原值二进制里面1的个数了。
附上代码:方法
int hammingDistance(int x, int y){ int iDistance = 0; unsigned int uiXor; uiXor = x ^ y; while (uiXor > 0) { if (uiXor & 1) { iDistance ++; } uiXor >>= 1; } return iDistance; }