在C++中将整数移动到最接近4的整数

Mat*_*ins 7 c++ bit-manipulation

我想"被4整除"号在C钮整数到最近++,但如果数量是目前整除4.这是我最好的尝试,但我敢肯定,这是最理想的:

offset = (offset & 3) ? (offset | 3) +1 : offset;
Run Code Online (Sandbox Code Playgroud)

肯定有一种快速的做法,不包括第三级IF声明?

附加说明:在这种情况下,offset是32位int.

Mag*_*off 8

offset = (offset + 3) & ~(decltype(offset))3;
Run Code Online (Sandbox Code Playgroud)

要么

#include <type_traits>
// ...
offset = (offset + 3) &
    ~static_cast<std::remove_reference<decltype(offset)>::type>(3);
Run Code Online (Sandbox Code Playgroud)

如果你需要支持offset作为参考类型的可能性,例如size_t&.谢谢@BaummitAugen.

它似乎在offsetint没有类型转换时更宽的情况下工作offset = (offset + 3) & ~3;,但是我不确定它是否是由语言标准强制执行的.


该算法可以用英语描述为"add 3 then round down".

通过二进制算术将两个最低有效位设置为零来完成舍入部分.通过应用具有反位模式的二进制AND来完成位的取消,换句话说,我们制作所有位的位模式,其值我们希望保持不变并将其应用为掩码.

二进制表示3:00000011

我们得到逆位掩码~(按位NOT,不要与!逻辑NOT 混淆)运算符:~3

对于~运算符,操作数的大小决定了结果的大小,因此在我的机器~(unsigned char)3 == 252(1111 1100)和~(unsigned int)3 == 4294967292(1111 1111 1111 1111 1111 1111 1111 1100)上.整数文字的默认大小是int.

offset比较宽的类型(具有更多位)时int,我们需要~加宽操作数以使位掩码匹配.这就是为什么我们将文字3转换为与...相同的类型offset.