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