整数,n >= 0d > 0

除数是 d = 2^k`

除法:

q = n >> k;

取余:

r = n & (d - 1);

除数不是 2^k

编译器通常会把除法改写成乘法 + 移位,不一定真的发出除法指令

取余一般直接由商回算:

q = fast_div(n, d); // 除法
r = n - q * d; // 取余

fast_div 原理