目次
トピック
整数が 2 のべき乗であるかどうかをすばやく判断し、そうであればそれが何乗であるかを判断します。
一連の考え
最初に整数が 2 のべき乗であるかどうかを判断します。最も簡単な方法は (数値 & 数値 - 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;
}