给定一个数,使其转换为2的幂的形式,而转换后的数据大于或等于原始数据。
这里给出两种方式:穷举和位运算,而后者的效率好于前者。
1.判断一个数是否为2^n.
只要知道2的幂的形式的2进制形式就可以了,1=(1)2=1<<0,2=(10)2=1<<1,4=(100)2=1<<2.。。。。64=(1000000)2=1<<6
从而若一个数的二进制中,只有一个1,那它就是2的幂的形式。
从而可以通过移位运算
/*判断n是不是不2的幂
是:返回1
不是:返回0
*/
int is_2n_V0(int n){
if(0==n)
return 0;
while(n!=0)
{
if((n&0x01==1)&&((n>>1)!=0))
return 0;
n=n>>1;
}
return 1;
}
同时可以发现,2^n-1,与2^n的与运算为0。从而这种方式,比上面的效率高
int is_2n(int n){
return ((n!=0)&&((n&(n-1))==0));
}
2.转换为2的幂形式
一种方式是先判断它是否为
2的幂形式,若不是,则使其递增,然后判断。这种方式,效率不高,如为129,下一个2的幂数为256,则它循环判断。
另一种方式,就是通过位运算,判断它的最高位1的位置,然后把后面的1清空,并使其左移一位。
int to_2n(int n){
if(is_2n(n))
return n;
while(!is_2n(n))
n++;
return n;
}
/*
最高位的1左移一位。
*/
int to_2n_v2(int n){
int i=0;
if(is_2n(n))
return n;
while(n>0){
n=n>>1;
i++;
}
return 1<<i;
}
void main()
{
int a=129;
// printf("is_2n:%d\n",is_2n_V0(a));
//printf("is_2n:%d\n",is_2n(a));
printf("to 2n:%d\n",to_2n_v2(a));
}
to 2n:256
Press any key to continue
转载请标明出处: http://blog.csdn.net/lin200753/article/details/28414337