网上搜了一圈没有搜到对这个函数的说明。这个函数的名称给我造成一些误解,让我认为这是四舍五入的概念,对于浮点数取整一般有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的幂。

下面来看下运算过程:

  1. pow2 - 1:因为pow2是2的幂,pow2就可以表示为1 << n(其中n >= 1)如果pow2=8,那么n=3,二进制值就是0000 1000pow2 - 1的值就是0000 0111
  2. ~(pow2 - 1): 取反后的结果就是:1111 1000,这样就得到了计算pow2整倍数二进制掩码,任何数与这个掩码相于都可以被pow2整除。
  3. x + pow2 - 1: 任何一个数与上面的掩码进行相于都会得到一个小于等pow2的数。所需要x加上一个pow2最大的模数(pow2-1),确保x向上靠近pow2的整倍数。
  4. (x + pow2 - 1) &~ (pow2 - 1): 对结果进行pow2掩码运算,最终得到一个pow2的整倍数,并且可以保证结果大于等于x