leetcode-位运算1

给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。

class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        if(m==n)
            return m;
        int yihuo = m^n;
        int yu = m&n;
        yihuo = tmp(yihuo);
        return yihuo&yu;
    }
    
    public int tmp(int a){
    
        int tmp = 0;
        int tmpbit = 0;
        for(int i=0;i<32;i++){
            int t=(a & 0x80000000>>>i)>>>(31-i);
            if(t==1||tmpbit==1){
                tmpbit=1;
                t=1;
            }
            tmp = tmp + t*(1<<(31-i));
        }
    return ~tmp;
    }
    
}

拆分一下for循环这段代码,要理解这个移位输出的问题还需要理解的以下内容:
* 0x80000000是数的十六进制表示,转成二进制表示为10000000000000000000000000000000
* 运算的优先级,移位运算高于逻辑运算,>>>高于&
* 位逻辑与运算 1&1 = 1 ,0&1 = 0
* >>>无符号右移,移出部分舍弃,左边位补0;

for循环的语句块的执行顺序:
1 0x80000000 无符号右移 i位;
2 a 和 1的结果做按位与;
3 2的结果无符号右移31-i位
4 输出3的结果

(0x80000000 >>> i)的作用是mask,每次循环都与a做逻辑与操作,取a的第i位;
对上条结果>>> 31 - i作用是把取出的a的第i位移到最末位。

 

注:

无符号位移(>>>)和有符号位移(>>)的区别是

有符号位移运算时如果数字为正数时位移后在前面补0,为负数时则在位移后在前面补1

posted @ 2021-02-08 11:41  車輪の唄  阅读(32)  评论(0)    收藏  举报  来源