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位的演示图
为什么是位移这么多次
首先可以知道 对于只有首位是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;
}