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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值