基本上,这是指当整数减去一个给定的比特位数时会发生的行为,类似于使用减法处理溢出的整数。假设使用有符号整数,那么明显的方法是:
有没有比上面那个更少丑陋且最好更快的整洁方法呢?
更新:对于混淆大家的符号标记我表示歉意。我不经思考地包括了使用排除符号位的位数的引起混乱的标记。因此,将5个位替换为6个位以获得更多理智。
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
。 - interjay