C快速计算4的下一个倍数?

gen*_*sys 21 c bit-manipulation

将无符号舍int入为多个的快速方法是4什么?

4的倍数有两个最低有效位0,对吗?所以我可以将它们掩盖掉,然后执行一个switch语句,在给定的内容中添加1,2或3 uint.

这不是一个非常优雅的解决方案..

还有算术综述:

 myint == 0 ? 0 : ((myint+3)/4)*4
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法,包括一些位操作?

Jaa*_*koK 42

(myint + 3) & ~0x03
Run Code Online (Sandbox Code Playgroud)

3的加法使得4的下一个倍数变为4的前一个倍数,这是由模运算产生的,可以通过屏蔽来实现,因为除数是2的幂.

  • 如果myint已经是4的倍数,则不会给出下一个倍数 (3认同)
  • 它确实:4的倍数设置它的两个最低位,然后被屏蔽掉,留下原始,这也是OP代码的工作方式. (2认同)
  • Michael Brays的批评是正确的.如果myint已经是4的倍数,则它保持不变.jk的表达式给出了与原始值相同或更大的4的最小倍数.这不是我通常所理解的"下一个4"的意思. (2认同)

AnT*_*AnT 15

我假设您要实现的是输入数字的对齐,即如果原始数字已经是4的倍数,则不需要更改.但是,您的问题并不清楚.即使原始数字已经是倍数,也许你想要下一个倍数?请澄清.

为了i在任意边界上对齐任意非负数,n您只需要这样做

i = i / n * n;
Run Code Online (Sandbox Code Playgroud)

但这将使其与负无穷大相对应.为了使其与正无穷大对齐,请n - 1在执行对齐之前添加

i = (i + n - 1) / n * n;
Run Code Online (Sandbox Code Playgroud)

这已经足够用于所有意图和目的.在你的情况下,它会

i = (i + 3) / 4 * 4;
Run Code Online (Sandbox Code Playgroud)

但是,如果您希望从中挤出一些CPU时钟,您可能会使用这样一个事实,即i / 4 * 4可以用一点点来代替它i & ~0x3,为您提供

i = (i + 3) & ~0x3;
Run Code Online (Sandbox Code Playgroud)

如果现代编译器可以自己解决后者,我不会感到惊讶.


Ste*_*eel 5

如果“下一个 4 的倍数”是指大于 unsigned int 值 myint 的最小 4 倍数,那么这将起作用:

(myint | 0x03) + 1;
Run Code Online (Sandbox Code Playgroud)