位运算可模拟加减乘除底层逻辑,本质是复现CPU二进制运算;异或得不进位和,与运算配合左移得进位,循环直至进位为0。

Java 中的位运算符可以模拟加减乘除的底层逻辑,这本质上是复现 CPU 在二进制层面的运算方式。虽然实际开发中不会用它替代 +、-、*、/,但理解它有助于掌握计算机算术原理和面试中手写“不用 + 实现加法”这类题目。
用位运算实现加法(不使用 +)
加法本质是:**异或(^)计算不进位和,与(&)配合左移(
- 异或(a ^ b):相同为 0,不同为 1 → 模拟无进位加法(如 0+1=1,1+1=0)
- 与(a & b):仅当两位都为 1 时得 1 → 表示哪些位置会产生进位
- 进位左移((a & b) :进位要加到更高一位,所以左移 1 位
- 重复:将“无进位和”与“进位”再次相加,直到进位为 0
示例代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public static int add(int a, int b) {
while (b != 0) {
int sum = a ^ b; // 无进位和
int carry = (a & b) << 1; // 进位
a = sum;
b = carry;
}
return a;
}用位运算实现减法(不使用 -)
减法可转化为加法:a - b = a + (-b),而负数在补码中等于 按位取反再加 1(即 ~b + 1)。因此只需复用加法逻辑。
立即学习“Java免费学习笔记(深入)”;
- 先求
b的相反数:negB = add(~b, 1)(注意:~b 是按位取反,不是负号) - 再调用
add(a, negB) - Java 中整数本身就是补码存储,所以
~b + 1等价于-b,但我们要避免直接用-,所以用加法实现 +1
示例代码:
public static int subtract(int a, int b) {
int negB = add(~b, 1); // 求 -b
return add(a, negB);
}用位运算实现乘法(不使用 *)
模拟手工乘法:将乘数逐位右移,若该位为 1,则把被乘数左移对应位数后累加。核心是“**判断最低位是否为 1,累加,然后被乘数左移、乘数右移**”。
- 用
b & 1判断乘数b当前最低位是否为 1 - 若为 1,将
a加入结果(用上面的add) - 每次循环:a 左移 1 位(相当于 ×2),b 右移 1 位(看下一位)
- 处理符号:先记录结果正负(异或判断),最后统一取反(若需)
示例(忽略符号简化版):
public static int multiply(int a, int b) {
boolean negative = (a < 0) ^ (b < 0);
long x = Math.abs((long) a);
long y = Math.abs((long) b);
long res = 0;
while (y != 0) {
if ((y & 1) == 1) {
res = add(res, x); // 此处 add 需支持 long 或重载
}
x <<= 1;
y >>= 1;
}
return negative ? (int) -res : (int) res;
}注:实际需处理 int 边界和符号,推荐用 long 中间计算防溢出。用位运算实现除法(不使用 / 和 %)
模拟长除法:从高位开始,不断用“减法”试探能减多少次,每成功一次就将对应权重(2 的幂)加到商中。
- 先统一转为正数(记下符号),用绝对值运算
- 让除数尽可能左移(扩大),直到大于被除数
- 然后逐步右移,每次若当前被除数 ≥ 当前除数倍数,就减去并累加对应 2 的幂到商
- 关键操作:用
substract做减法,用>>控制位权
示例(非完整健壮版,仅示意逻辑):
public static int divide(int dividend, int divisor) {
if (divisor == 0) throw new IllegalArgumentException();
if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
<pre class="brush:php;toolbar:false;">boolean neg = (dividend < 0) ^ (divisor < 0);
long a = Math.abs((long) dividend), b = Math.abs((long) divisor);
int quotient = 0;
while (a >= b) {
long temp = b, multiple = 1;
while (a >= (temp << 1)) {
temp <<= 1;
multiple <<= 1;
}
a = subtract(a, temp);
quotient = add(quotient, (int) multiple);
}
return neg ? -quotient : quotient;}
这些实现揭示了算术运算在硬件中的本质:全是位移、与、或、异或、取反的组合。写一遍加法,其余就顺理成章。不复杂但容易忽略边界和符号处理。

















