1.问题说明
十进制4
0100
十进制8
1000二进制不同的
0100
1000有两位不同
正常的算法
1.两个数字与1,拿出两个数字的最后一位,比较是否相同,直到右移32次,
for (int i = 0; i < 32; i++){if ((m & 1) != (n & 1)){count++;}m = m >> 1;n = n >> 1;}
眼前一亮的机器算法
0100
1000
1100//异或,结果12,不同的位全部置1
1100 & 1011
12 &(12-1)
0100//异或结果
4&(4-1)
0100&0011
0000//异或结果
比较难想到,也比较难理解
u = m^n; //m和n异或while (u) //相当于找出一个数;二进制中1的个数{count++;u = u & (u - 1);}