leetcode高频题笔记之位运算

本文总结了位运算在解决LeetCode算法题中的常见应用,包括位1的个数、2的幂、4的幂的判断,以及各种位操作技巧在求解汉明距离、只出现一次的数字等问题上的运用。通过异或、与、左移等位运算,巧妙解决编程难题。
摘要由CSDN通过智能技术生成

位运算常见问题

在这里插入图片描述
在这里插入图片描述

191.位1的个数

在这里插入图片描述
解法一:
利用x&1返回最低位是否为1,不断的左移1
从最低位一个1开始与,如果不为0计数加1

public class Solution {
   
    public int hammingWeight(int n) {
   
        int x = 1;
        int count = 0;
        for (int i = 0; i < 32; i++) {
            
            if ((n & x) != 0) {
   //和某位的一个1进行与操作,如果不为0则存在1,计数+1
                count++;
            }
            x = x << 1;//左移一位
        }
        return count;
    } 
}

解法二:
利用x&(x-1)去掉最后一位1,判断如果去掉最后一位后为0了可以提前结束,去掉了多少次就去掉了多少个0

public class Solution {
   
    // you need to treat n as an unsigned value
     public int hammingWeight(int n) {
   
        int count = 0;
        while (n != 0) {
   
            count++;
            n &= (n - 1);
        }
        return count;
    }
}

231.2的幂

在这里插入图片描述
2的幂值都满足只有一个1
只有一个1的不一定是2的幂值,排除一个数-2147483648 即 Integer.MIN_VALUE,它的二进制是1个1和31个0,1代表符号位

采用x&(x-1)去除掉最低位的1,如果x&(x-1) == 0则只有一个1是2的幂

public class Solution {
   
    public boolean isPowerOfTwo(int n) {
   
        return n != 0 && n != Integer.MIN_VALUE && (n & (n - 1)) == 0;
    }
}

342.4的幂

在这里插入图片描述
与2的幂一样,只有一个1,并且这个1的位置是固定的,是偶数位
所以还需要剔除下在 奇数位的值
0xaaaaaaaa = 0b10101010101010101010101010101010
只要1的位置全为0,则不符合

public class Solution {
   
    public boolean isPowerOfFour(int num) {
   
        return num != 0 && (num & (num - 1)) == 0 && (0xaaaaaaaa & num) == 0;
    }
}

190.颠倒二进制位

在这里插入图片描述
思路:返回结果初始化全0,从最低位开始判断每一位是否为0,如果不为0将返回值的31-i位设置为1

public class Solution {
   
    public int reverseBits(int n) {
   
        int x = 1;//用来&操作的变量
        int res = 0;//初始化全0
        for (int i 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值