1. 程式人生 > >C++給定範圍進行按位與運算

C++給定範圍進行按位與運算

LeetCode上的題目:
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.

給定一個範圍,將範圍內的所有的數(包含首尾的數)進行按位與,返回結果。

冥思苦想寫了一堆程式碼,結果單行程式碼就解決了,看來基礎還是太太太薄弱了。
以下是自寫程式碼,雖然思想是對的,但是隨著輸入數值變大,運算速度出奇的慢,直接超時。

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int m=5,n=7;
    int result=0,x=m;
    int bit;
    int s=0;    
    int lon=n-m;      
     while(x!=0)//計算最小數m的二進位制位數
     {
        x=x/2;
        s++;
     }

    for(int i=0;i<s;i++)//比m位數還多的位,和m相與肯定為0
    {
        int
num=m; bit =0; for(int j=m;j<n+1;j++) { num=j; num=num/pow(2.0,i); bit=num%2; if(bit==0) j=n+1; } if (bit==1) { result+=pow(2.0,i); } cout<<result<<endl; } system("pause"
); return 0; }

執行結果4
若m和n相差很大,則超時。

再看看人家的單行程式碼:

class Solution {
public:
    int rangeBitwiseAnd(int m, int n) {
        return (m == n) ? m : (rangeBitwiseAnd(m >> 1, n >> 1) << 1);
    }
};

雖然不太理解,但是實在佩服。