1

有人来挑战吗?我正在寻找一种有效的算法来实现固定最大值的数字的换行/溢出行为。

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

#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 溢出条件的方式。我想知道是否有一种快速有效的方法来实现这种包装?像移位或其他按位运算一样?

4

3 回答 3

5

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

于 2013-01-10T15:35:45.343 回答
3
int_fast8_t translate(int_fast32_t value) {
  return sgn(value)*( (abs(value)+MAX)%(2*MAX+1)-MAX )
}

int_fast32_t应该这样做,假设为类型定义了模块化划分

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

于 2013-01-10T15:43:15.147 回答
0

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

return ((input + MAX_VALUE) % (MAX_VALUE * 2 + 1)) - MAX_VALUE;
于 2013-01-10T16:39:49.140 回答