201. Bitwise AND of Numbers Range
仅供自己学习
思路:
因为是left到right范围内的所有元素的相与和,所以如果这个范围的数的二进制如果每一位都有0,那么最终就是0。如果不为0的话,那说明范围内所有数的某个位都为1。
所以相与是公共前缀,即相同的高位加上后续的全为0,那么和我们只需要一直右移到left和right相等即可,此时就获得了公共前缀。我们在记录右移次数,再返回结果左移那么多次数的数即可。
代码:
1 class Solution { 2 public: 3 int rangeBitwiseAnd(int left, int right) { 4 int count=0; 5 while(left!=right){ 6 left>>=1; 7 right>>=1; 8 count++; 9 } 10 return left<<count; 11 } 12 };
另一种方法是 n%(n-1),通过这个方法将剩余位的1去掉,得到 公共前缀。
代码:
1 class Solution { 2 public: 3 int rangeBitwiseAnd(int left, int right) { 4 int count=0; 5 while(left<right){ 6 right=right&(right-1); 7 } 8 return right; 9 } 10 };