基本上,当用减法溢出整数时得到的行为,但是对于给定的位数。显而易见的方法,假设一个有符号整数:
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
有没有一种简洁的方法,它比上面的方法更不难看,最好更快?
更新:很抱歉造成混乱。我不假思索地包含了使用不包括叹息位的位数的令人困惑的符号。所以在上面,用 6 位替换 5 位以获得更多的理智。