Целочисленное вычитание с циклическим переходом для N битов

В основном, поведение, которое вы получаете при переполнении целых чисел с вычитанием, но для заданного числа битов. Очевидный способ, предполагающий целое число со знаком :

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 для большего удобства.

5
задан porgarmingduod 29 November 2011 в 14:41
поделиться