Cjson中pow2gt函数简单分析
最近看了下cjson,发现里面有个比较好玩的函数
static int pow2gt
( int x)
|
{
--x; x|=x>>1; x|=x>>2; x|=x>>4; x|=x>>8; x|=x>>16; return x+1;
}
|
该函数的作用是返回比x大的最小的2的N次方数。
那么具体是如何实现的呢?我在网上搜了下,发现大家都没有太关注。那么我这里简单的画个图,来描述下为什么是这种结果吧。
可以看到,考虑到int是32位,那么对于任何一个M,当它执行完上图中的5步操作后,M的最左边为1的那位向右全部被赋值为1,因此,在最后return x+1 时,就会返回>=M最小的2的N次方数。而最开始的–x,是因为当x本身就是一个2的N次方数时,返回值为x本身,所以需要减1来保证正确性。
http://cstriker1407.info/blog/pow2gt_in_cjson/
#include <stdio.h>
int pow2gt(int x)
{
--x;
x |= x>>1; //这5行把一个整数左边第一个1到末位全变成1
x |= x>>2;
x |= x>>4;
x |= x>>8;
x |= x>>16;
return x+1;
}
void getBooleanArray(int b,char a[],int strlen)
{
memset(a,0,strlen);
int i;
for ( i = 31; i >=0; i--)
{
a[i] = (int)(b & 1);
b = (int) (b >> 1);
}
for(i=0;i<32;i++)
printf("%d",a[i]);
printf("\t");
}
int main( void )
{
int testnum = 16;
int num = pow2gt(testnum);
printf("%d\n",num);
char a[32]={ 0 };
getBooleanArray(testnum,a,32);
}
CJSON的比较好的几篇文章
源码解析:http://ju.outofmemory.cn/entry/105377
使用方法:http://blog.csdn.net/fengxinlinux/article/details/53121287