网上搜了一圈没有搜到对这个函数的说明。这个函数的名称给我造成一些误解,让我认为这是四舍五入的概念,对于浮点数取整一般有3种情况:
- round: 四舍五入
- floor: 向下取整
- ceil: 向上取整
always_inline uword round_pow2 (uword x, uword pow2)
{
return (x + pow2 - 1) &~ (pow2 - 1);
}
这个函数虽然不是作用于对浮点数,但它的行为更接近ceil,即向上取整。
简单的说这个函数作用就是将x
取整成pow2
的整倍数。同时要求取整后的结果必须大于等于x的值。
这个函有一点需要注意:参数pow2
必须是大于等2,并且是2的幂。
下面来看下运算过程:
pow2 - 1
:因为pow2
是2的幂,pow2
就可以表示为1 << n
(其中n >= 1
)如果pow2=8
,那么n=3
,二进制值就是0000 1000
。pow2 - 1
的值就是0000 0111
。~(pow2 - 1)
: 取反后的结果就是:1111 1000
,这样就得到了计算pow2
整倍数二进制掩码,任何数与这个掩码相于都可以被pow2
整除。x + pow2 - 1
: 任何一个数与上面的掩码进行相于都会得到一个小于等pow2
的数。所需要x
加上一个pow2
最大的模数(pow2-1
),确保x
向上靠近pow2的整倍数。(x + pow2 - 1) &~ (pow2 - 1)
: 对结果进行pow2
掩码运算,最终得到一个pow2的整倍数,并且可以保证结果大于等于x
。