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.
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.
它似乎在offset比int没有类型转换时更宽的情况下工作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.
| 归档时间: |
|
| 查看次数: |
428 次 |
| 最近记录: |