gpt4 book ai didi

c++ - 在 C++ 中将整数移动到最接近的可被 4 整除的位置

转载 作者:可可西里 更新时间:2023-11-01 18:15:54 25 4
gpt4 key购买 nike

我想在 C++ 中将整数向上移动到最接近的“可被 4 整除”的数字,但如果该数字当前可被 4 整除则不行。这是我最好的尝试,但我确信这是次优的:

offset = (offset & 3) ? (offset | 3) +1 : offset;

一定有一种不包含三级 IF 语句的快速方法吗?

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

最佳答案

offset = (offset + 3) & ~(decltype(offset))3;

或者

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

如果需要支持offset是引用类型的可能性,比如size_t&。谢谢@BaummitAugen。

offsetint 宽时,即使没有类型转换,它似乎也能工作,offset = (offset + 3) & ~3;,但我不确定它是否由语言标准强制执行。


这个算法可以用英文描述为“add 3 then round down”。

舍入部分是通过二进制算法将两个最低有效位设置为零来完成的。位的取消设置是通过应用二进制 AND 和逆位模式来完成的,换句话说,我们为所有我们想要保持其值不变的位创建一个位模式,并将其用作掩码。

3的二进制表示:00000011

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

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

offset 是比 int 更宽的类型(位数更多)时,我们需要将 ~ 的操作数加宽,以便位掩码火柴。这就是为什么我们将文字 3 转换为与 offset 相同的类型。

关于c++ - 在 C++ 中将整数移动到最接近的可被 4 整除的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25361002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com