我想知道如何通过仅使用bitshift或bitwise运算符将整数与另一个整数(均为正)相除来获得余数。不应使用/
运算符或%
运算符。
例如,为了在除数的格式为2^k
时获得余数,以下操作产生余数。
m = Remainder
n = The number
d = The divisor
m = n & ( d - 1 )
但是,只有当d
的格式为2^k
时,此方法才有效。我想知道2
的非幂的类似方法。我目前正在处理来自programming challenges
的问题,并希望采用这种方法来缩短程序执行时间
答案 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
的测试。