如何将数字包装到一个范围中

How to wrap a number into a range?

本文关键字:一个 范围 数字 包装      更新时间:2023-10-16

我有一个程序,它接受字符串中的每个字符。 向其添加一个数字 x(x 每次添加到字符时都会增加)。我需要新字符 (c+x) 在范围 [32,126] 内。

我知道使用 %126 来保持 c+x

<126,但我如何确保>32 并且数字在该范围内"换行"?

这是我的代码:

string a;
unsigned int x = 1;
cin >> a;
for (auto &c : a)
{
    if (c <= 126 && c >= 32)
    {
        if (c + x > 126) //checking if c needs to be wrapped
        {
            c = (c + x) % (126); //wrapping c? <-- this is the problem
        }
        else
        {
            c += x;
        }
        if (x == 256)
        {
            x = 1;
        }
        else
        {
            x++;
        }
    }
    cout << c;
}

编辑:我想出了包装它的行应该是:

c = 31 + (c + x) % (126);

我意识到我已经尝试过这个,但用 32 而不是 31,这意味着它会将其排除在包装到 32 之外。

UPD:请参阅下面的@Ky评论,我稍后会更新答案。

由于%运算符允许您获得[0; limit)空间,因此当您需要[start; limit)空间时,标准方法是通过运算符获取空间[0; limit - start] %然后将其添加到start。这样,您将获得[start; limit)空间。所以公式将是

numberToBeWrapped = start + (numberToBeWrapped - start) % (limit - start)

或者,在您的情况下:

c = 32 + (c + x - 32) % (126 - 32);

int wrapSpaceSingle(int start, int end, int wrapNum) {
    int out = ((wrapNum % (end - start)) + (end - start)) % (end - start) + start;
    return out;
}

这应该行得通。