可能非常简单的问题,但我推出的这个实现看起来太复杂了......
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
}
在我的情况下z=4
(我知道我可以用&
位运算符替换模运算),我想知道是否可能会有一个涉及更少步骤的实现。
答案 0 :(得分:2)
如果z
是2的幂,则模运算可以减少到这个按位运算:
return (x + z - 1) & ~(z - 1);
例如,这种逻辑对于数据结构边界对齐非常常见。更多信息:https://en.wikipedia.org/wiki/Data_structure_alignment
答案 1 :(得分:0)
如果z是2的幂并且整数是无符号的,则以下内容将起作用:
x + (z - 1) & ~(z - 1)
如果z是任意数字,我无法想到使用bit-twiddling的解决方案。