C 数据结构与算法 — 判断整数的 2 幂次方

目录

文章目录

题目

快速判断一个整数是否是 2 的幂次方,若是,并判断出来是多少次方。

思路

首先判断整数是否为 2 的幂次方,最简单的方式就是 (number & number - 1) == 0。例如:

  • 3:11
  • 2:10
  • 3 & 2 != 0,所以 3 不是 2 的幂次方。

然后,判断整数是 2 的几次方。一个 2 的幂次方的整数,其二进制形式有一个共同的特点:

  1. 只有一个 1;
  2. 并且 1 后面跟了 n 个 0;

因此问题可以转化为判断 1 后面跟了几个 0 即可。

代码

#include <stdio.h>
#include <stdlib.h>

/**
 * 2 的幂次方均为 100... 样式
 * 2**0 - 1
 * 2**1 - 10
 * 2**2 - 100
 */
int power2(int val) {
    
    
    if (val <= 0) {
    
    
        return -1;        
    } else if (1 == val) {
    
    
        return 0;
    } else {
    
    
        return 1 + power2(val >> 1);
    }
}

int main(void) {
    
    
    int num;
    printf("input a number: ");
    scanf("%d", &num);
    /* 首先判断整数是否为 2 的幂次方。 */
    if (num & (num - 1)) {
    
    
        printf("%d 不是 2 的幂次方\n", num);
    } else {
    
    
        printf("%d 是 2 的 [%d] 次幂\n", num, power2(num));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Jmilk/article/details/130285043