数字范围按位与
给定初始数字到结尾数字,求其所有数字按位与的结果。
public int rangeBitwiseAnd(int left, int right) {
int head = 1 << 30;
int res = 0;
while (head > 0 && ((left&head) == (right&head))) {
res |= left&head;
head >>= 1;
}
return res;
}
数字叠加按位与,其公共前缀部分是不会受影响的,而非公共部分因必然会遍历到011111…和1000…(非公共部分的第一位必然不同即0和1,那么两种数值切换点即上述数值)所以按位与结果必然为0;
那么思路就是取出公共前缀即可。int数据去除符号位总共31位,1<<30就是从第31位开始遍历,(left&head) == (right&head)
用于判断所遍历到的前缀是否相等;res |= left&head;
因为head就是1从高位逐渐降下来,那么left&head就是从高到低逐位取值,res|=就是将值赋到res上。