基本的には、減算を使用して整数をオーバーフローさせたときの動作を所定のビット数で取得します。明白な方法は、を仮定すると、符号付き整数:以下醜いと上記の1よりも高速であることを行うためのきちんとした方法は、Nビットのラップアラウンドを伴う整数減算
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ビットで置き換え、より多くの正気性を確保しています。
また、> = max' 'Vをチェックする必要があります。 – interjay
-32〜31の範囲は、5ではなく6ビットを必要とします。 – TonyK
これは、あなたの視点に完全に依存します。私はちょうど私が現在使用しているコードの符号を除いたビットの数を示すのに慣れていますが、それはちょうど混乱していると思います。 – porgarmingduod