cJSON pow2gt函数解析

本文介绍了 cJSON 中已删除的 pow2gt 函数,该函数用于计算大于或等于给定值的最小2次幂。通过4位二进制数的示例,解释了函数如何通过位移操作来实现,并讨论了为何需要先自减以及如何适应不同大小的整数类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cJSON pow2gt函数解析

在最新的版本中 已经没有这个函数了 现在的策略是如果没有超过INT_MAX 就直接翻倍

计算不小于 x 的最小2次幂

static int pow2gt (int x)	{
    --x;
    x|=x>>1;	x|=x>>2;	x|=x>>4;	x|=x>>8;	x|=x>>16;
    return x+1;	
}

源函数一眼看上去不知道是干什么的

那先减少位数 看看发生了什么

这里用4位二进制数展示 那么这里对应只做两次移位或等

pow2ge(9);

x:1000
x|=x>>1:
1000
 100
1100(第一次运算结果)
x|=x>>2:
1100
  11
1111(第二次运算结果)
return 15+1;

32位的演示图

图源https://www.w3study.wiki/a/202108/553089.html

为什么是位移这么多次

首先可以知道 对于只有首位是1的二进制串每次做上述的|=(移位或等)操作 只需要 ⌈ log ⁡ 2 n ⌉ \lceil\log_2n\rceil log2n 次操作即可(每次能翻转的1是上次的两倍 一个公比为2的等比数列) 那么带入位数长度就能得到结果了

为什么要先自减

为了保证自身是2的幂的时候不会出错

思考题 如何改进这个代码让它适应不同大小的int或者整数类型

static int pow2gt (size_t x)	{
    --x;
    for(int i=1;i<sizeof(x);i*=2){
        x|=x>>i;
    }
    return x+1;	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值