标准(或boost)是否提供了一种递增整数的方法,确保它不会延续并从零开始但保持最大值?或者我只需要创建自己的(这看起来确实应该包含一些实用功能)。
template<typename T>
void Increment(T& x)
{
if(x != std::numeric_limits<T>::max()) ++x;
}
答案 0 :(得分:3)
据我所知,没有这样的实用程序,所以你需要建立自己的。
有一篇很好的文章介绍了饱和算术:Branchfree Saturating Arithmetic,它们涵盖了所有的算术运算。他们的例子在C中,但不难翻译。
对于你的情况,我们会考虑补充。他们假设如下:
#include <limits.h>
typedef unsigned u32b;
typedef signed s32b;
对于无符号加法,他们提供以下代码:
u32b sat_addu32b(u32b x, u32b y)
{
u32b res = x + y;
res |= -(res < x);
return res;
}
和签名的补充:
s32b sat_adds32b(s32b x, s32b y)
{
u32b ux = x;
u32b uy = y;
u32b res = ux + uy;
/* Calculate overflowed result. (Don't change the sign bit of ux) */
ux = (ux >> 31) + INT_MAX;
/* Force compiler to use cmovns instruction */
if ((s32b) ((ux ^ uy) | ~(uy ^ res)) >= 0)
{
res = ux;
}
return res;
}
正如Pascal Cuoq在评论中指出的那样,未签名的案例假设两个补充,对绝大多数情况应该没有问题,但标准不对基础表示做出假设。