最近看了下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次方数时,需要减1来保证正确性。
发表评论