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