基本的に、整数を減算でオーバーフローさせたときに得られる動作ですが、特定のビット数に対してです。符号付き整数を想定した明白な方法:
template <int BITS>
int sub_wrap(int v, int s) {
int max = (1<<(BITS));
v -= s;
if (v < -max) v += max*2;
// or if branching is bad, something like:
// v += (max*2) * (v < -max)
return v;
}
// For example subtracting 24 from -16 with 5 bit wrap,
// with a range of -32, 31
sub_wrap<5>(-16, 28); -> 20
上記のものよりも醜くなく、できれば高速である、それを行うためのきちんとした方法はありますか?
更新:混乱について申し訳ありません。ため息ビットを除いたビット数を使用するという紛らわしい表記を無意識に含めました。したがって、上記では、5ビットを6ビットに置き換えて、より多くの健全性を実現します。