c++ - 围绕一个范围包装无符号整数加法/减法

标签 c++ c algorithm

我需要一个函数来计算 unsigned val 的总和和 signed dX并将结果包装在 lower 范围内和 upper

例如:

值为 5 , 变化 -6 , 以及 0 的范围和 10会返回 10 .

< 1 2 3 4 5 6 7 8 9 10 >

值为 2 , 变化 3 , 和 1 的范围和 3会返回 2

/*
 * Given a value and a change in that value (dX), find the sum and wrap it between lower and upper.
 */
unsigned int wrap(unsigned int val, const int dX, const unsigned int lower, unsigned int upper)
{

}

我真的不知道如何处理无符号和有符号的加法/减法以避免下溢。我也不确定如何包装下限。

最佳答案

如果您愿意将dxconst int 更改为int,您可以在循环中进行算术运算。这避免了 upper - lower 超过 INT_MAX 可能出现的问题。

#include <stdio.h>

unsigned int wrap_add(unsigned int val,
                      int dx,
                      const unsigned int lower,
                      const unsigned int upper);

int main(void)
{
    printf("Range [0, 10]: 5 + (-6) = %u\n", wrap_add(5, -6, 0, 10));
    printf("Range [1, 3]: 2 + 3 = %u\n", wrap_add(2, 3, 1, 3));
    printf("Range [2, 5]: 2 + (-9) = %u\n", wrap_add(2, -9, 2, 5));

    return 0;
}

unsigned int wrap_add(unsigned int val,
                      int dx,
                      const unsigned int lower,
                      const unsigned int upper)
{
    while (dx < 0) {
        if (val == lower) {
            val = upper;
        } else {
            --val;
        }
        ++dx;
    }

    while (dx > 0) {
        if (val == upper) {
            val = lower;
        } else {
            ++val;
        }
        --dx;
    }

    return val;
}

程序输出:

Range [0, 10]: 5 + (-6) = 10
Range [1, 3]: 2 + 3 = 2
Range [2, 5]: 2 + (-9) = 5

关于c++ - 围绕一个范围包装无符号整数加法/减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42941088/

相关文章:

c++ - Qt SQL : how to differentiate between a double and an int?

c - 在分配变量时获取变量的地址是否合法?

c++ - OpenCV:如何对带有图像的文件夹进行批处理?

c++ - 二叉搜索树未处理的异常

c - 为什么我的 x64 程序在 Windows 上无声地崩溃?

MySQL 和用户偏好的预定更新?

algorithm - 算法-尝试在拥有相等数量的玩家的同时平衡团队技能水平

python - 掷 6 面骰子到距起点 N 格有多少种可能?

c++ - 有没有一种标准的方法来使用 STL 在 Linux 上使用 gcc 进行 findfirst、findnext?

c - 如何传递对字符串的引用?