Cjson中pow2gt函数简单分析

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次方数。

那么具体是如何实现的呢?我在网上搜了下,发现大家都没有太关注。那么我这里简单的画个图,来描述下为什么是这种结果吧。

Cjson中pow2gt函数简单分析

可以看到,考虑到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