偶然看到云风的http://blog.codingnow.com/2011/12/buddy_memory_allocation.html 代码,发现了一个比较巧妙的实现。
static inline int
is_pow_of_2(uint32_t x) {
return !(x & (x-1));
}
static inline uint32_t
next_pow_of_2(uint32_t x) {
if ( is_pow_of_2(x) )
return x;
x |= x>>1;
x |= x>>2;
x |= x>>4;
x |= x>>8;
x |= x>>16;
return x+1;
}
这里算法的意思是从最高bit位为1的位开始,从左边往右边复制bit位为1到相邻的bit位。考虑最差的情况,比如128,需要复制的次数比较多,只不过它已经是2的整数次幂,这里举个极端的例子,表明移动复制1的过程,理解算法的意思。
1000 0000
| 0100 0000 //复制1位
= 1100 0000
| 0011 0000 //复制2位
= 1111 0000
| 0000 1111 //复制4位
= 1111 1111
很清晰,很高效啊。