一种基于最大值包装/溢出数的算法

时间:2013-01-10 15:32:35

标签: c++ c algorithm

任何挑战者?我正在寻找一种有效的算法来实现一个用最大值固定的数字的包装/溢出行为。

比如说,最大可能数值定义为:

#define MAX_NUMBER_VALUE 100

函数translate采用带符号的32位或64位整数值并使用该MAX_NUMBER_VALUE常量“包裹”:

int_fast8_t translate(int_fast32_t value) {

  if (abs(value) > MAX_NUMBER_VALUE) {
    return ...; // This!
  }

  return value;
}

预期的输入和输出:

translate(55)   => 55
translate(100)  => 100
translate(101)  => -100
translate(102)  => -99
translate(200)  => -1
translate(202)  => 1
translate(300)  => 99
translate(-40)  => -40
translate(-100) => -100
translate(-101) => 100
translate(-102) => 99
translate(-200) => 1
translate(-201) => 0
...

值围绕数字“行走”,好像它是一个圆形行星。这看起来类似于C / C ++处理int溢出条件的方式。我想知道是否有一种快速有效的方法来实现这种包装?像位移或其他按位操作一样?

3 个答案:

答案 0 :(得分:5)

听起来你只是在描述%运算符,并对负数进行了一些细致的处理。

答案 1 :(得分:3)

int_fast8_t translate(int_fast32_t value) {
  return sgn(value)*( (abs(value)+MAX)%(2*MAX+1)-MAX )
}

应该这样做,假设为int_fast32_t类型

定义了模块划分

编辑以包括处理负数但现在看起来有点麻烦。有关sgn(x)的智能实现,请参阅this

答案 2 :(得分:0)

只要您的input + MAX_VALUE小于有问题的整数类型的最大值,我认为您可以使用它,甚至不需要初始abs检查:

return ((input + MAX_VALUE) % (MAX_VALUE * 2 + 1)) - MAX_VALUE;