查找大于或等于 x(正整数)z 倍数(正整数,可能是 2 的幂)的最小整数

Find smallest integer greater or equal than x (positive integer) multiple of z (positive integer, probably power of 2)

本文关键字:整数 的幂 大于 倍数 查找      更新时间:2023-10-16

可能是非常简单的问题,但我提出了这个看起来太复杂的实现......

unsigned int x;
unsigned int z;
unsigned int makeXMultipleOfZ(const unsigned x, const unsigned z) {
    return x + (z - x % z) % z;
    //or
    //return x + (z - (x + 1) % z - 1); //This generates shorter assembly, 
                                        //6 against 8 instructions
}
  • 我想避免 if 语句
  • 如果这有帮助,我们可以有把握地说 z 将是 2 的幂

就我而言,z=4(我知道我可以用 & 位运算符替换模运算),我想知道是否可以附带一个涉及更少步骤的实现。

如果 z 是 2 的幂,则取模运算可以简化为以下按位运算:

return (x + z - 1) & ~(z - 1);

例如,此逻辑对于数据结构边界对齐非常常见。更多信息在这里: https://en.wikipedia.org/wiki/Data_structure_alignment

如果 z 是 2 的幂并且整数是无符号的,则以下内容将起作用:

x + (z - 1) & ~(z - 1)

如果 z 是任意数字,我想不出使用位摆动的解决方案。