目录
题目
快速判断一个整数是否是 2 的幂次方,若是,并判断出来是多少次方。
思路
首先判断整数是否为 2 的幂次方,最简单的方式就是 (number & number - 1) == 0。例如:
- 3:11
- 2:10
- 3 & 2 != 0,所以 3 不是 2 的幂次方。
然后,判断整数是 2 的几次方。一个 2 的幂次方的整数,其二进制形式有一个共同的特点:
- 只有一个 1;
- 并且 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;
}