钳位增量整数?

时间:2014-09-02 03:35:34

标签: c++ boost

标准(或boost)是否提供了一种递增整数的方法,确保它不会延续并从零开始但保持最大值?或者我只需要创建自己的(这看起来确实应该包含一些实用功能)。

template<typename T>
void Increment(T& x)
{
    if(x != std::numeric_limits<T>::max()) ++x;
}

1 个答案:

答案 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在评论中指出的那样,未签名的案例假设两个补充,对绝大多数情况应该没有问题,但标准不对基础表示做出假设。