По сути, поведение, которое вы получаете при переполнении целых чисел с вычитанием, но для заданного количества бит. Очевидный способ, предполагающий целое число со знаком:
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
. - person interjay   schedule 29.11.2011