https://blog.csdn.net/linyt/article/details/53355355 巧夺天工的kfifo(修订版)
https://blog.csdn.net/chen19870707/article/details/39899743 眉目传情之匠心独运的kfifo
https://www.cnblogs.com/suozhang/p/6373510.html 参考文章
第一个问题
//找出最接近 最大2的指数次幂
unsigned int roundup_pow_of_two(unsigned int date_roundup_pow_of_two )
{
/* 这里采用 STM32 硬件提供的计算前导零指令 CLZ
* 举个例子,假如变量 date_roundup_pow_of_two 0x09
*(二进制为:0000 0000 0000 0000 0000 0000 0000 1001), 即bit3和bit0为1
* 则__clz( (date_roundup_pow_of_two)的值为28,即最高位1 前面有28个0,32-28 =3 代表最高位1 的 位置
* 31UL 表示 无符号 int 数字 31,否则默认为 有符号 int 数字 31
*/
return ( 1UL << ( 32UL - ( unsigned int ) __clz( (date_roundup_pow_of_two) ) ) );
}
第0个问题
关于求一个整数是否为2的幂,isPowerOfTwo()的分析
https://blog.csdn.net/OnionOmelette/article/details/53718623
如果一个数x为2的n次方,那这个数的二进制就只有一个位(记为m)为1,其他均为0。
并且有,x-1的二进制表现形式为:第m位为0,其余(0到m-1)位为1。
由此,恰恰好x跟x-1的按位或结果就是为0了,(x和x-1二进制的同一位置上均只有一个地方出现0)。
java:
boolean isPowerOfTwo(int num) {
return (num > 0) && (num & (num - 1)) == 0
}
回答第一个问题:
https://www.cnblogs.com/tangxin-blog/p/6131326.html
判断一个整数是否为2的幂 以及 上向2的幂扩展
uint32_t roundup_pow_of_two(const uint32_t x)
{
if (x == 0){ return 0; }
if (x == 1){ return 2; }
uint32_t ret = 1;
while (ret < x)
{
ret = ret << 1;
}
return ret;
}
非常好用!!!
char isPowerOfTwo(uint32_t num)
{
return (num > 0) && (num & (num - 1)) == 0
}