Побитовый сдвиг возвращает одно значение и, таким образом, «теряет» любой остаток.
Для степени двойки он может быть связан с битовой маской, которая вычисляет «что было потеряно» в ранее примененном сдвиге.
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;