2016-06-14 133 views
0

给定一个值n,将其置于[min, max]范围内的最有效方法是什么?如果它超出范围,它将在整个范围内重复?最有效的方法来“剪辑”一个值来重复一个范围?

我不知道这个术语,所以很难短语的问题,但也许事实表可能有所帮助:

min = -2max = 3

input --> output 
    -6  0 
    -5  1 
    -4  2 
    -3  3 
    -2  -2 
    -1  -1 
    0  0 
    1  1 
    2  2 
    3  -2 
    4  -1 
    5  0 
    6  1 

我有什么事这么远是这样的:

(value - min) % (max - min) + min; 

其中一期工程,但我担心的是模运算符%是不可靠的负输入,从ω帽子我读过(输出成为实现定义,使之无用,或至少不可移植)

+1

为什么不取绝对值的模​​数? –

+0

显示你的尝试。 –

+0

这是你正在寻找的方程吗? 'X%(最大值 - 最小值)+ min' – Zohar81

回答

1

它是这样的:

min = VALUE; 
max = VALUE; 
x = (((x - min) + 1) % (max - min)) + min 

这里x是里面最小和最大 - 1,当你重复代码最后一行

编辑:

,并满足您的具体表:

output = (input - min) % (max - min) + min; 

编辑2:

如果模数不为负数定义:

if (input >= min) 
    output = (input - min) % (max - min) + min; 
else 
    output = max - ((max - input) % (max - min)); 
+0

如果'(input - min)'产生负数,这个工作是否会奏效?我读过C/C++,负数的模数不是由语言定义的(结果的符号可能是负数) –

+0

我已更新答案以匹配此案例 – ammcom

0

如果我理解正确的话你的要求,这里是最简单的公式我能想到的:x % (max - min) + min

而且here你可以找到一些优化模运算符的方法。

相关问题