Bitwise AND of Numbers Range
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.
For example, given the range [5, 7], you should return 4.
Java代码: public class Solution {
public int rangeBitwiseAnd(int m, int n) {
Set set = new HashSet<>();
for (int tmp = m, i = 0; tmp > 0; tmp = tmp / 2, i++) {
if (tmp % 2 == 1) {
set.add(i);
}
}
if (set.size() == 0)
return 0;
ArrayList<Integer> list = new ArrayList<Integer>();
Iterator ite = set.iterator();
while (ite.hasNext()) {
int tmp = (Integer) ite.next();
if ((n >> tmp) % 2 == 0)
list.add(tmp);
}
for (int i = 0; i < list.size(); i++)
set.remove(list.get(i));
if (set.size() == 0)
return 0;
int middle = m + (n - m) / 2;
while (middle != m) {
ite = set.iterator();
list.clear();
while (ite.hasNext()) {
int tmp = (Integer) ite.next();
if ((middle >> tmp) % 2 == 0)
list.add(tmp);
}
for (int i = 0; i < list.size(); i++)
set.remove(list.get(i));
if (set.size() == 0)
return 0;
middle = m + (middle - m) / 2;
}
ite = set.iterator();
int result = 0;
while (ite.hasNext()) {
int tmp = (Integer) ite.next();
result += 1 << tmp;
}
return result;
}
}
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
Set set = new HashSet<>();
for (int tmp = m, i = 0; tmp > 0; tmp = tmp / 2, i++) {
if (tmp % 2 == 1) {
set.add(i);
}
}
if (set.size() == 0)
return 0;
ArrayList<Integer> list = new ArrayList<Integer>();
Iterator ite = set.iterator();
while (ite.hasNext()) {
int tmp = (Integer) ite.next();
if ((n >> tmp) % 2 == 0)
list.add(tmp);
}
for (int i = 0; i < list.size(); i++)
set.remove(list.get(i));
if (set.size() == 0)
return 0;
int middle = m + (n - m) / 2;
while (middle != m) {
ite = set.iterator();
list.clear();
while (ite.hasNext()) {
int tmp = (Integer) ite.next();
if ((middle >> tmp) % 2 == 0)
list.add(tmp);
}
for (int i = 0; i < list.size(); i++)
set.remove(list.get(i));
if (set.size() == 0)
return 0;
middle = m + (middle - m) / 2;
}
ite = set.iterator();
int result = 0;
while (ite.hasNext()) {
int tmp = (Integer) ite.next();
result += 1 << tmp;
}
return result;
}
}