给定数A(= 2 ^ N),如何获得N?

时间:2017-10-19 05:34:23

标签: c

例如,

Input   result
2       N: 1
4       N: 2
8       N: 3

我可以直接在c使用吗?

或者有没有快速简单的方法来获得N?

矿:

//假设A不是很大

int getN(int A) {
  int i = 0;
  for(i = 0;;i++) {
    if( 1 << i == A ) return i;
  }
}

3 个答案:

答案 0 :(得分:3)

假设输入适合long,如果您不太关心性能,请使用log2计算基数2中的logarithm(然后将其投射到int)每other个答案。顺便说一句,你的幼稚getN实际上足够快(但是无限循环以获得0输入,你可以用for(i = 0; i<64; i++)来限制它,甚至可能比log2更快,你可以使它成为static inline函数(在某些头文件中)。

如果您正在使用GCC并且如果您知道输入是2的幂(因此只设置了一位),您可以使用更快__builtin_ffs builtin(找到先设置位。)

如果数字非常大,您想要arbitrary precision arithmetic。然后使用像GMPlib这样的库。

答案 1 :(得分:2)

如果您想使用自定义递归函数来获取N,请使用此函数。否则请输入输入日志。

int getN(int num){
    if((num/2)==1){
        return 1;
    }
    else if((num%2)!=0){
        return 0;
    }
    else{
        return (1 + getN(num/2));
    }
}

答案 2 :(得分:1)

当然有 - log2 ( double d )

像这样使用:

#include <math.h>
#include <stdio.h>
#define N somenumber
int main(){
    int a = 1 << N;                     // == 2 raised to the power of N
    printf("%d", (int)log2((double)a)); // output: N.   can leave out the cast, for double format result
    return 0;
}