本文主要是介绍201 数字范围按位与 二进制转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
// 如果left和right不在同一个[2^i, 2^(i + 1)]范围内一定是0
// 因为此时按照二进制分解left高位是0, 而区间内肯定有高位是1后面全0的数
// 比如5, 9 左边left为0101, 区间内有8,其二进制形式为1000
// 在同一个范围时, 看高位有多少个相同的1,累加即可
// 更好的是不断去除末位的1class Solution {
public:int rangeBitwiseAnd(int left, int right) {if (left == right) return left;vector<int> l;vector<int> r;toBin(l, left);toBin(r, right);if (l.size() != r.size())return 0;int res = 0;for (int i = l.size() - 1; i >= 0; i--) {if (l[i] != r[i]) {break;}if (l[i] & 1)res += 1 << i;}return res;}void toBin(vector<int> &bin, int num) {while(num) {if (num & 1)bin.emplace_back(1);elsebin.emplace_back(0);num /= 2;}}
};// Brian Kernighan 算法 去末位1class Solution {
public:int rangeBitwiseAnd(int left, int right) {while(left < right) {right = right & (right - 1);}return right;}
};
这篇关于201 数字范围按位与 二进制转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!