C データ構造とアルゴリズム - 整数の 2 乗の判定

目次

記事ディレクトリ

トピック

整数が 2 のべき乗であるかどうかをすばやく判断し、そうであればそれが何乗であるかを判断します。

一連の考え

最初に整数が 2 のべき乗であるかどうかを判断します。最も簡単な方法は (数値 & 数値 - 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