cJSON源码分析--位运算案例

源码(C):

int pow2gt (int x)	
{	
    --x;	    //防止x恰巧是2的n次幂
    x|=x>>1;	//1
    x|=x>>2;	//2
    x|=x>>4;	//3
    x|=x>>8;	//4
    x|=x>>16;	//5
    return x+1;	
}

应用场景:2^{n-1}< x\leq 2^{n},x,n均为正整数,则返回数值2^{n}

原理:用二进制表示整型数值(x-1),从非0的最高位开始做右移运算后再与原数值(x-1)做按位或运算。

案例:x=101,减1后二进制表示:x = 01100100  (只列出后八位);

右移1位:01100100  >>  00110010,

按位或: \frac{01100100}{00110010}=01110110, 

x = 01110110(二进制);

右移2位:01110110  >>  00011101,

按位或:\frac{01110110}{00011101}=01111111,  

x = 01111111(二进制);

右移4位:01111111  >>  00000111,

按位或:\frac{01111111}{00000111}=01111111

x = 01111111(二进制);

重复操作。。。

最后返回:x=x+1 = 01111111(二进制) + 1 = 10000000(二进制) = 128(十进制)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值