Как найти остаток с помощью побитового оператора? - PullRequest
0 голосов
/ 28 октября 2018

Давайте посмотрим на следующий код.

int x = 5>>1;

Что он делает, он делит заданное значение на 2 степени 1 (что равно 2) и возвращает частное.Можно ли получить остаток при битовой операции?

1 Ответ

0 голосов
/ 28 октября 2018

Побитовый сдвиг возвращает одно значение и, таким образом, «теряет» любой остаток.

Для степени двойки он может быть связан с битовой маской, которая вычисляет «что было потеряно» в ранее примененном сдвиге.

int quotient = 5 >> 1;
int remainder = 5 & 0x01;

Значение маски, приведенное выше, может быть вычислено с помощью: ~((~(int)0) < 1); для 32-разрядного типа int ~0 == 0xFFFF, 0xFFFF << 1 == 0xFFFE и ~0xFFFE == 0x01.

Итак, замена на переменные:

int n = ..;
int z = ..;
int quotient = n >> z;
int remainder = n & ~((~(int)0) << z);

Аналогично, в более общем случае целочисленное деление (/) связано с оператором по модулю (%). Каждый оператор возвращает только одно значение.

int n = ..;
int z = ..;
int p = 1 << z;
int quotient = n / p;
int remainder = n % p;
...