mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
498 字
2 分钟
【算法笔记】(十四)位运算实现加减乘除
2026-04-10
统计加载中...

位运算实现加减乘除#

package class033;
// 不用任何算术运算,只用位运算实现加减乘除
// 代码实现中你找不到任何一个算术运算符
// 测试链接 : https://leetcode.cn/problems/divide-two-integers/
public class BitOperationAddMinusMultiplyDivide {
public static int MIN = Integer.MIN_VALUE;
public static int divide(int a, int b) {
if (a == MIN && b == MIN) {
// a和b都是整数最小
return 1;
}
if (a != MIN && b != MIN) {
// a和b都不是整数最小,那么正常去除
return div(a, b);
}
if (b == MIN) {
// a不是整数最小,b是整数最小
return 0;
}
// a是整数最小,b是-1,返回整数最大,因为题目里明确这么说了
if (b == neg(1)) {
return Integer.MAX_VALUE;
}
// a是整数最小,b不是整数最小,b也不是-1
a = add(a, b > 0 ? b : neg(b));
int ans = div(a, b);
int offset = b > 0 ? neg(1) : 1;
return add(ans, offset);
}
// 必须保证a和b都不是整数最小值,返回a除以b的结果
public static int div(int a, int b) {
int x = a < 0 ? neg(a) : a;
int y = b < 0 ? neg(b) : b;
int ans = 0;
for (int i = 30; i >= 0; i = minus(i, 1)) {
if ((x >> i) >= y) {
ans |= (1 << i);
x = minus(x, y << i);
}
}
return a < 0 ^ b < 0 ? neg(ans) : ans;
}
public static int add(int a, int b) {
int ans = a;
while (b != 0) {
// ans : a和b无进位相加的结果
ans = a ^ b;
// b : a和b相加时的进位信息
b = (a & b) << 1;
a = ans;
}
return ans;
}
public static int minus(int a, int b) {
return add(a, neg(b));
}
public static int neg(int n) {
return add(~n, 1);
}
// 这种乘法后面有大用处,尤其是求(a的b次方 % m)的结果,也叫龟速乘
public static int multiply(int a, int b) {
int ans = 0;
while (b != 0) {
if ((b & 1) != 0) {
// 考察b当前最右的状态!
ans = add(ans, a);
}
a <<= 1;
b >>>= 1;
}
return ans;
}
}
【算法笔记】(十四)位运算实现加减乘除
http://hgqwd.icu/posts/suanfa14/
作者
天线宝宝死于谋杀
发布于
2026-04-10
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00