题目两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数x和y计算并返回它们之间的汉明距离。示例 1输入x 1, y 4输出2解释1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 上面的箭头指出了对应二进制位不同的位置。示例 2输入x 3, y 1输出1提示0 x, y 231- 1注意本题与 2220. 转换数字的最少位翻转次数 相同。算法题目要求比较两个数字的二进制表示有多少个位置上的数字不一样算法进行了两次转换比较 x 和 y 的每一个二进制位使用 ”异或x ^ y“不同的位置自动变成 1统计 1 的个数每次读取最低位读取后右移遍历每次读取最低位s 1 可以获取最低位整数 1 的二进制表示为 …0001。 是按位与运算只有对应的两个位都为 1结果才为 1s 1 1最低位为 1。s 1 0最低位为 0。读取后右移s 1 可以遍历所有位右移一位会将每个二进制位向右移动一格最低位被移出。通用思路先用异或找出不同的位置再统计异或结果中 1 的数量。优化只统计为 1 的位s (s - 1) 会将 s 最右侧的 1 变成 0最右边的那个 1 被消掉了其余更高位的 1 仍然保留。举例s 101100如果正常统计1的个数需要遍历每一位。通过下面的两步解决执行 “s - 1 后原来的101100变成了101000。最右边的那个1被消掉了其余更高位的1仍然保留。与原数字进行按位与 ”“原数字右边两个位置都是0减一后的这两个位置虽然变成了1101100 101011 101000既然每次操作都能消掉一个1那么我们每消掉一个就把计数器加一。代码普通class Solution { public int hammingDistance(int x, int y) { // 第一步异或运算 // 相同位得到 0不同位得到 1 // 因此 s 中 1 的个数就是两个数的汉明距离 int s x ^ y; // ret 用于统计 s 中二进制位 1 的数量 int ret 0; // 只要还有未处理的二进制位就继续统计 while (s ! 0) { // 通过 s 1 获取最低位 // 如果最低位是 1则 ret 加 1 ret s 1; // 右移一位丢弃已经统计过的最低位 s 1; } // 返回不同二进制位的数量 return ret; } }优化只统计1的个数classSolution{publicinthammingDistance(intx,inty){// 异或结果中1 表示对应位置不同intsx^y;intret0;while(s!0){// s (s - 1) 会将 s 最右侧的 1 变成 0ss-1;// 每次删除一个 1计数加 1ret;}returnret;}}