【发布时间】:2012-01-08 17:17:32
【问题描述】:
基本上,当用减法溢出整数时得到的行为,但对于给定的位数。显而易见的方法,假设一个 signed 整数:
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 位会更加合理。
【问题讨论】:
-
您还需要检查
v >= max。 -
-32 到 31 的范围需要 6 位,而不是 5 位。
-
这完全取决于您的观点。我只是习惯于在我当前使用的代码中表示不包括符号的位数,但我想这只是令人困惑。
标签: c++ math bit-manipulation subtraction