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

Sim*_*Sim 1 c c++ algorithm

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

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

#define MAX_NUMBER_VALUE 100
Run Code Online (Sandbox Code Playgroud)

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

int_fast8_t translate(int_fast32_t value) {

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

  return value;
}
Run Code Online (Sandbox Code Playgroud)

预期的输入和输出:

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
...
Run Code Online (Sandbox Code Playgroud)

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

Oli*_*rth 5

听起来你只是在描述%操作符,并对负数进行一些仔细的处理.

  • 你应该详细说明这种"对负数的谨慎处理" - 这是我认为的问题的重要方面.我怀疑答案是否会非常有用. (2认同)