位运算

LeetCode之位运算

位运算的相关知识可以参见以下博文:位运算的相关知识

LeetCode 第190题:颠倒给定的32位无符号整数的二进制位

解析:用一个变量 res 去存储结果,依次得到要转换数字的低位,然后依次保存到 res 中。res 每得到一位后进行左移腾出位置保存下一位。举个具体的例子。

原数字 1011 ,res = 0
    
res 左移一位,res = 0,
得到 1011 的最低位 1 加过来, res = 1
1011 右移一位变为 101
    
res = 1 左移一位,res = 10,
得到 101 的最低位 1 加过来, res = 11
101 右移一位变为 10 
    
res = 11 左移一位,res = 110,
得到 10 的最低位 0 加过来, res = 110
10 右移一位变为 1 
    
res = 110 左移一位,res = 1100,
得到 1 的最低位 1 加过来, res = 1101
1 右移一位变为 0, 结束

转化为代码:

public int reverseBits(int n) {
    int res = 0;
    int count = 0;
    while (count < 32) {//count从0开始计数
        res <<= 1;  //res 左移一位空出位置
        res |= (n & 1); //得到的最低位加过来
        n >>= 1;//原数字右移一位去掉已经处理过的最低位
        count++;
    }
    return res;
}

详细的分析过程可参见:https://leetcode-cn.com/problems/reverse-bits/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-4-9/

LeetCode第231题:给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

解析:若 n为2的幂,则一定满足以下条件
1.恒有n & (n - 1) == 0,因为:
(1)n 二进制最高位为 1,其余所有位为 0;
(2)n−1 二进制最高位为 0,其余所有位为 1。
2.一定满足 n > 0。
因此,可以通过 n>0且n&(n-1)=0来判断n是不是2的幂。
代码如下:

public boolean isPowerOfTwo(int n) {
    return n > 0 && (n & (n - 1)) == 0;
}

此外还有一种迭代的方法,代码如下:

public boolean isPowerOfTwo(int n) {
    if (n == 0) return false; 
    while(n != 1){
        int res = n % 2;
        if(res == 0) n = n/2;
        else return false;
    }
    return true;
}

详细的分析过程可参见:https://leetcode-cn.com/problems/power-of-two/solution/power-of-two-er-jin-zhi-ji-jian-by-jyd/

LeetCode第268题:给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数

解析:首先生成一组1-n的数据,之后再生成要求序列中的所有数,利用异或运算中的交换律(两个数相同异或后为0,0与任何数异或都是任何数)和结合律就可以得到缺少的那个数字。

代码如下:

public int missingNumber(int[] nums){
    int res = 0;
    for(int i = 1; i <= nums.length; i++){
        res ^= i;
    }
    for(int i : nums){
        res ^= i;
    }
    return res;
}

详细的解题过程可以参见:https://leetcode-cn.com/problems/missing-number/solution/268-javayi-huo-shu-xue-fang-fa-by-ustcyyw/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值