例如,
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;
}
}
答案 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;
}