乘法
比如有两个数字13=(1101),9=(1001),此时计算两者的乘法可以从13的最低位往最高位遍历,如第一个为1,则有1001,第二位为0跳过,第三位为1,则再加上1001左移2位即100100,此时结果为101101,最后一位也是1则加上1001000,最终结果为1110101=117
代码demo如下:
public static long multiply(long x, long y) {
long sum = 0;
while (x != 0) {
if ((x & 1) != 0) {
sum = add(sum, y); }
X »>= 1;
y«= 1;
}
return sum;
}
private static long add(long a, long b) {
long sum = 0, carryin = 0, k = 1, tempA = a, tempB = b;
while (tempA != 0|| tempB != 0) {
long ak=a&k, bk=b&k;
long carryout = (ak & bk) I (ak & carryin)| (bk & carryin);
sum |= (ak ^ bk ^ carryin);
carryin = carryout « 1;
k «= 1;
tempA »>= 1;
tempB »>= 1;
}
return sum| carryin;
}
除法
求x/y,思路是找出满足(2^k)* y < x 的最大k值,并使x减去该值后继续循环直到x<y 即可得到结果
public static long divide(long x, long y) { long result = 0;
int power = 32;
long yPower = y << power;
while (x >= y) {
while (yPower > x) {
yPower »>= 1;
--power;
}
result += IL << power;
X -= yPower;
}
return result;
}