我想知道如何仅使用位移或按位运算符(仅限两个正整数)来获得整数除以另一个整数的余数。不应使用/
运算符或 %
运算符。
例如,当除数为2^k
形式时,可以使用以下操作获得余数。
m = 余数
n = 数字
d = 除数
m = n & ( d - 1 )
但是,此方法仅适用于d
为2^k
形式的情况。我想知道一种类似的非2次幂的方法。我目前正在解决编程挑战问题,并希望使用这种方法来减少程序执行时间。
我想知道如何仅使用位移或按位运算符(仅限两个正整数)来获得整数除以另一个整数的余数。不应使用/
运算符或 %
运算符。
例如,当除数为2^k
形式时,可以使用以下操作获得余数。
m = 余数
n = 数字
d = 除数
m = n & ( d - 1 )
但是,此方法仅适用于d
为2^k
形式的情况。我想知道一种类似的非2次幂的方法。我目前正在解决编程挑战问题,并希望使用这种方法来减少程序执行时间。
任何不使用运算符%
的答案都会是一个效率较低的答案,但是如果您绝对不能使用该运算符,则可以使用循环反复从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
。