位运算解决【汉明距离】

声明:小白总结,本意是记录自己的思路,不过希望能帮助别人,那就更好啦,若发现问题,欢迎指正,感谢!!
来源:力扣(LeetCode)
链接:461.汉明距离

题目

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 231.

输入: x = 1, y = 4
输出: 2

解释:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑
 上面的箭头指出了对应二进制位不同的位置
关于^的理解

// ^运算
1 ^ 1 = 0;
0 ^ 1 = 1;
a ^ a = 0;
两数相同运算结果为0,不同时运算结果为1;

^相当于无进位加法
并不是指二进制的某一位的运算,而是整个数的运算(由于我在将循环条件写成 while(m == 1),认为不同时就参与运算,而此时算的是整个数字的值,而不是某一位,即使右移,只要前面还有1存在,结果就不会是1,而只有当前面全为0时,结果为0,即使之前全部为1也不是1,所以循环条件因为 != 0 ,即前面不存在1了,循环结束)

右移位

这里采用右移位,每个位置都会被移动到最右边。移位后检查最右位的位是否为 1 即可。检查最右位是否为 1,可以使用取模运算(i % 2)或者 AND 操作(i & 1),这两个操作都会屏蔽最右位以外的其他位。

//测试
package easy;

public class L461 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int x = 1, y = 4;
		int m = x ^ y;
		int count = 0;
		while(m != 0) {
			System.out.println(m);
			if((m & 1) == 1) {
				count++;
			}
			m = m >> 1;
		}
		System.out.println("**");
		System.out.println(count);
	}
}

// 结果
5
2
1
**
2

代码
//java
class Solution {
    public int hammingDistance(int x, int y) {
        int m = x ^ y;
        int count = 0;
        while(m != 0){
            if((m & 1) == 1){
                count++;
            }
            m = m >> 1;
        }
        return count;
    }
}

感谢各位巨巨们的帮助,希望在记录分析题目的条件下算法能有所提升……
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值