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 に答える