[LeetCode] 一些位操作类的算法

1. 出处

找列表中唯一出现一次的元素
汉明重量/数1出现的次数
汉明距离

2. 说明

2.1 基本规则

从二进制数开始分析有一些有趣的基本操作:

  • 乘2: 右移动1位
  • 除2: 左移1位
  • 0 & 0 = 0, 1 & 0 = 0, 1 & 1 = 0,这个用来处理数1出现的位数,后边会写
  • 0 ^ 0 = 0, 1 ^ 0 = 1, 1 ^ 1 = 0 ,只要位不相同就为1,这里用来数唯一出现的数字
  • java中的Integer是32位有符号整数,因此100000000…..0 = -2147483648 即 Integer.MIN_VALUE
  • Integer 的1000000….0 继续左移动以为则为0。
  • Integer.MIN_VALUE = 100000….00 而 Integer.MAX_VALUE = 0111111….111 因此快速获得 Integer.MAX_VALUE = (1 << 31) -1

2.2 技巧

2.2.1 唯一出现一次的元素

因为异或操作的特性,任何数异或0都是自己,自己异或自己就是0。因此对一个列表用0异或第一个元素,然后逐次向下异或即可得到唯一出现的元素了。

class Solution {
    public int singleNumber(int[] nums) {
        if(nums.length==1) {
            return nums[0];
        } else {
            int initNum = 0;
            for(int num: nums) {
                initNum ^= num;
            }
            return initNum;
        }
    }
}

2.2.2 汉明重量

通过1作为游标进行与运算,当1出现的位置与游标重合时,与的结果不为0。

public class HammingWeight {

    public int hammingWeight(long n) {
        int tag = 1;
        int count = 0;
        while (tag != 0) {//由于int类型的函数是32位因此要循环32次
            if ((n & tag) != 0)
                count++;
            tag = tag << 1;

        }
        return count;
    }
}

2.2.3 汉明距离

找出不相同的位数量,在2.2.2 的基础上,将两数做一次异或运算就变成了2.2.2的题目了~~~

public class HammingDistance {
    public int hammingDistance(int x, int y) {
        int dif = (x ^ y);
        int tag = 1;
        int count = 0;
        while (tag != 0) {//由于int类型的函数是32位因此要循环32次
            if ((dif & tag) != 0)
                count++;
            tag = tag << 1;

        }
        return count;
    }
}

2.2.4 其它技巧

  • 判断是否是偶数: n & 1 == 1
  • 不用临时变量交换两个数的位置: a ^= b; b ^= a; a ^= b;
  • 判断符号是否相同: (x ^ y) >= 0;
  • -
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值