纯用位运算实现加减乘除,涉及一些基础的位运算知识,代码注释里都已经写清楚。
public class BitOperationCalculate {
public int add(int a, int b) {
//a+b=(a^b)+(a&b)<<1=a`+b`=(a`^b`)+(a`&b`)<<1 直到b`为0,此时的a就是结果
//a`=a^b(a异或b) b`=(a&b)<<1(进位信息)
while (b != 0) {
int sum = a ^ b;
b = (a & b) << 1;
a = sum;
}
return a;
}
public int sub(int a, int b) {
//一个数的负数等于该数取反加1
//a-b=a+(-b)=a+(~b+1)
return add(a, add(~b, 1));
}
public int multi(int a, int b) {
int res = 0;
/**
* a=3 0011
* b=4 * 0100
* ----------------------------
* 0000
* 0000
* 0011
* 0000
*------------------------------
* = 001100 =12
* 根据上述计算过程 就可以理解下面的逻辑了
*/
while (b != 0) {
if ((b & 1) != 0) {
res = add(res, a);
}
//无符号右移
b >>>= 1;
a <<= 1;
}
return res;
}
private boolean isNegative(int n) {
return n < 0;
}
private int div(int a1, int b1) {
//转为正数
int a = isNegative(a1) ? add(~a1, 1) : a1;
int b = isNegative(b1) ? add(~b1, 1) : b1;
int res = 0;
/**
* a/b
* 假设 a=2^7*b+2^5*b+2^3*b 那么a/b=2^7+2^5+2^3
* 计算过程就是 a-2^7*b a-2^5*b a-2^3*b 得到结果 2^7+2^5+2^3
*/
for (int i = 30; i >= 0; i = sub(i, 1)) {
//因为b左移涉及符号位,可能会导致变成负数,就会错误,所以用a右移是一个性质
//包含等号,否则少算一个数
if ((a >> i) >= b) {
res |= (1 << i);
a = sub(a, b << i);
if (a == 0) {
//如果已经减为0了,就代表计算结束了,也代表a可以整除b,可以测一下能整除的一定会走到这
//不能整除的不会进来,不能整除的直到for循环结束
break;
}
}
}
//判断正负 返回
return isNegative(a1) != isNegative(b1) ? add(~res, 1) : res;
}
public int divide(int a, int b) {
//我们知道,Integer.MIN_VALUE没有绝对值 所以int最小值要单独考虑
if (a == Integer.MIN_VALUE && b == Integer.MIN_VALUE) {
return 1;
} else if (b == Integer.MIN_VALUE) {
return 0;
} else if (a == Integer.MIN_VALUE) {
if (b == sub(0, 1)) {
//b=-1 直接返回int最大值,否则计算有问题
return Integer.MAX_VALUE;
}
if (b == 1) {
//b=1 直接返回int最小值,省去计算
return Integer.MIN_VALUE;
}
int res = (div(add(a, 1), b));
int yu = sub(a, multi(res, b));
return add(res, div(yu, b));
}
return div(a, b);
}
public static void main(String[] args) {
BitOperationCalculate bitOperationCalculate = new BitOperationCalculate();
System.out.println("23+(-45)= " + bitOperationCalculate.add(23, -45));
System.out.println("34-(-98)= " + bitOperationCalculate.sub(34, -98));
System.out.println("-12/4= " + bitOperationCalculate.div(-12, 4));
System.out.println("-3*4= " + bitOperationCalculate.multi(-3, 4));
System.out.println("8*9= " + bitOperationCalculate.multi(8, 9));
System.out.println("-8*-7= " + bitOperationCalculate.multi(-8, -7));
System.out.println("9*0= " + bitOperationCalculate.multi(9, 0));
System.out.println("Integer.MIN_VALUE / 3= " + bitOperationCalculate.divide(Integer.MIN_VALUE, 3));
System.out.println(Integer.MIN_VALUE / 3);
System.out.println("Integer.MAX_VALUE / 3 " + bitOperationCalculate.div(Integer.MAX_VALUE, 3));
System.out.println(Integer.MAX_VALUE / 3);
System.out.println("Integer.MIN_VALUE / -1= " + bitOperationCalculate.divide(Integer.MIN_VALUE, -1));
System.out.println("Integer.MIN_VALUE / 1= " + bitOperationCalculate.divide(Integer.MIN_VALUE, 1));
System.out.println(Integer.MIN_VALUE);
}
}
leetcode运行结果
标签:java,divisor,int,相除,截断,dividend,加减乘除,231,运算 From: https://blog.csdn.net/weixin_56812051/article/details/144448831