hamming distance(汉明距离)数字二进制中按位不相等的个数。

本题中,条件规定x,y取值区间为[0,2^32)

算法1:x和y做按位与运算,得到的值右移直到0,统计1的个数。

一次按位与运算,每次循环中一次按位与运算

public class HammingDistance {



    private static int hammingDistance(int x, int y) {

        int val = x ^ y;

        int num = 0;

        while (val > 0) {

            if ((val & 1) == 1) {

                num ++;

            }

            val = val >> 1;

        }

        return num;

    }



    public static void main(String[] args) {

        System.out.println(hammingDistance(1, 4));

    }

}

算法2,最多循环32次,每次循环中3次按位与运算。

每次循环中

(1)先取val为1左移n位,n为0~31区间取值,val与当前x和y分别做按位与运算

(2)如果val值大于x和y,则说明已经没有可比较的值,跳出循环即可

(3)按位与运算结果为x和y第i位是否为1,如果x和y当前位不相等,则最终结果num+1

public class HammingDistance {

    private static int hammingDistance(int x, int y) {

        int num = 0;

        for (int i = 0; i < 32; i++) {

            int val = 1 << i;//1

            if (val > x && val > y) {//2

                break;

            }

            if ((x & val) != (y & val)) {//3

                num ++;

            }

        }

        return num;

    }



    public static void main(String[] args) {

        System.out.println(hammingDistance(1, 4));

    }

}