一个关于2的次方问题


问题:

判断一个正整数是否是2的次方(比如16是2的四次方,返回1;不是则返回0)。(要求性能尽可能高)


解法一:

int check(int number){
    int temp = 1;
    while(temp <= number){
        if(temp == number){
            return 1;
        }
        temp = temp * 2;
    }
    return 0;
}

思路简单一个一个比较,时间复杂度O(logN)


解法二:

int check(int number){
    int temp = 1;
    while(temp <= number){
        if(temp == number){
            return 1;
        }
        temp = temp << 1;
    }
    return 0;
}

通过位运算进行了一点优化,时间复杂度仍然为O(logN),本质上没什么区别


解法三:


int check(int number){
    if(number & (number-1) == 0){
        return 1;
    }
    else{
        return 0;
    }
}

通过一次减法和与运算,时间复杂度只有O(1),在本质上有很大的优化。

具体思路: 2的n次方数的二进制是有规律的

2:  10            2-1:        1        &   0
4:  100            4-1:        11        &   0
8:  1000            8-1:        111     &   0
16:  10000        16-1:        1111    &   0
32:  100000        32-1:    11111    &   0
    ...             ...
    2^n                     2^n-1
    
    7:  0111        7-1:    0110    &   0110
    36: 100100      36-1:  100011  &   100000

将左右两边的结果做与运算,结果很明显。

计算机算加减乘除的时间对比

位运算 优化运算速度


2018/10/12

By PQ

猜你喜欢

转载自www.cnblogs.com/glasses/p/10023814.html