查找大于或等于 x(正整数)z 倍数(正整数,可能是 2 的幂)的最小整数
Find smallest integer greater or equal than x (positive integer) multiple of z (positive integer, probably power of 2)
可能是非常简单的问题,但我提出了这个看起来太复杂的实现......
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 是任意数字,我想不出使用位摆动的解决方案。
相关文章:
- C++使用整数的压缩数组初始化对象
- 在计算中使用二的幂有多有利可图
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 添加存储在向量中的大整数的函数出现问题
- 显示基于用户输入的整数的字符
- 如何找到大于整数的最小数字
- 如何切换整数的 N 位
- 一个整数的log2,该整数是2的幂
- 长整数不适用于 8 的幂C++
- 为什么发出如此复杂的代码来将有符号整数除以 2 的幂
- 查找大于或等于 x(正整数)z 倍数(正整数,可能是 2 的幂)的最小整数
- 以幂形式 (^) 打印整数的质因数
- 检查正整数是否为2的幂的最短方法
- 取浮点数最接近的整数次幂
- 将无符号整数四舍五入为2的幂序列
- 用于计算非常非常大的正整数的幂函数的数字模
- 在有效时间内将一个正整数写成2的幂的和的方法总数
- 在c++中有没有更快的方法来检验一个数是否是2的整数次幂?
- 在取小数的整数次幂时保持精度