变换以获得剩余

时间:2012-11-25 04:08:57

标签: java bit-manipulation number-theory

我想知道如何通过仅使用bitshift或bitwise运算符将整数与另一个整数(均为正)相除来获得余数。不应使用/运算符或%运算符。

例如,为了在除数的格式为2^k时获得余数,以下操作产生余数。

m = Remainder

n = The number

d = The divisor

m = n & ( d - 1 )

但是,只有当d的格式为2^k时,此方法才有效。我想知道2的非幂的类似方法。我目前正在处理来自programming challenges的问题,并希望采用这种方法来缩短程序执行时间

1 个答案:

答案 0 :(得分:1)

任何不使用运算符%的答案都是效率较低的答案,但是,如果绝对不能使用运算符,那么,一种解决方案是使用循环从n中重复减去d:

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

假设您的整数是32位,那么您可以考虑一个优化版本,我们从n中删除d的倍数:

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

此示例假设整数已签名并监视溢出,即di > 0的测试。