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

An algorithm to wrap/overflow number based on max value

本文关键字:包装 溢出 数字 算法 最大值 一种      更新时间:2023-10-16

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

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

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

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

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

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

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

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

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