位运算和加法可模拟乘法:将b转为二进制,若其第i位为1,则累加a左移i位的结果。全程不使用乘、除、取模运算符。

可以通过位运算和加法来模拟乘法过程,核心思路是将其中一个数拆解为二进制,利用“左移等价于乘以 2 的幂”这一特性,逐位判断并累加。
用位运算 + 加法实现乘法
整数乘法可转化为:若 b 的第 i 位为 1,则结果加上 a × 2i;而 a × 2i 就是 a 左移 i 位。因此只需遍历 b 的每一位,用位与(&)判断是否为 1,再用左移()得到对应倍数,用加法累加即可。
- 需处理负数:统一转为正数计算,最后根据符号规则决定结果正负
- 推荐先取绝对值,用 long 防止 int 最小值取反溢出(如
Math.abs(Integer.MIN_VALUE)仍为负) - 循环中不断右移 b,同时左移 a,避免手动计数位数
代码示例(含符号处理)
以下是一个健壮的实现:
<font size="2">public static int multiply(int a, int b) {
// 处理符号:记录结果是否为负
boolean negative = (a >= 1; // b 右移,看下一位
}
result = negative ? -result : result;
return (int) result; // 转回 int(题目限定整数相乘,假设不溢出)
}</font>
其他可行方法
除位运算外,还有几种不依赖 * 的思路:
-
递归加法:比如
multiply(a, b) = a + multiply(a, b-1),但效率低(O(|b|)),且需处理负数和边界(如 b=0、b 为负) -
快速加法(类似快速幂):递归地将 b 折半,如
b 为偶 → multiply(a>1);b 为奇 → a + multiply(a>1),时间复杂度 O(log|b|) - 循环加法:简单直观,但仅适合小数值,大数易超时
注意事项
实际使用中要注意:
- Java 中
Integer.MIN_VALUE取绝对值仍是它自己(因为补码表示无对应正数),所以必须先转long再取绝对值 - 位移操作对负数右移用
>>是算术右移(补符号位),但本方法中我们只对非负数操作,更安全 - 若题目要求完全不使用任何乘除模运算符,上述位运算法完全满足
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











