Подтвердить что ты не робот

Сдвиг влево для получения остатка

Я хочу знать, как получить остаток, разделив целое число на другое целое (оба положительные), используя только битовые или побитовые операторы. Оператор / или % не должен использоваться.

Например, для получения остатка, когда делитель имеет вид 2^k, следующая операция дает остаток.

m = Remainder

n = The number

d = The divisor

m = n & ( d - 1 )

Однако этот метод работает только тогда, когда d имеет вид 2^k. Я хочу знать аналогичный метод для не-полномочий 2. В настоящее время я работаю над проблемой из programming challenges и хочу использовать такой метод для сокращения времени выполнения программы.

4b9b3361

Ответ 1

Любой ответ, который не использует оператор %, будет менее эффективным ответом, но если вы абсолютно не можете использовать оператор, то одним из решений является использование цикла для вычитания d из n:

m = n;
while (m >= d)
{
  m -= d;
}

Предполагая, что ваши целые числа являются 32-битными, вы можете рассмотреть оптимизированную версию, где мы удаляем кратность d из n:

m = n;
for (i = 31; i >= 0; i--)
{
  di = d << i;
  if (di > 0 && m >= di) m -= di;
}

В этом примере предполагается, что целые числа подписаны и отслеживает переполнение, т.е. тест для di > 0.