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的幂.
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)
如果现代编译器可以自己解决后者,我不会感到惊讶.
如果“下一个 4 的倍数”是指大于 unsigned int 值 myint 的最小 4 倍数,那么这将起作用:
(myint | 0x03) + 1;
Run Code Online (Sandbox Code Playgroud)