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

浙公网安备 33010602011771号