Java 位运算实现加减乘除
一 分析
a=13;
b=9;
a的二进制:1101
b的二进制:1001
1.加法
不考虑进制加: 结果等于0100 等同于 a^b
考虑进制加:结果等于10110 等同于 (a&b)>>1
使用while循环或者递归方式,直到进制位等于0
2.减法
a-b == a+(-b),所以只需要计算a的负数,调用加法即可
-b = ~b+1;(负数存储是以补码形式存储,补码=反码+1)
-b 的二进制:10111
3.乘法
参考
a*b:从乘数(b开始)的低位开始,如果当前位等于1,把当前被乘数左移当前位在乘数的位数,遍历乘数的每一位,直到遍历完成,遍历完成后,将每次的结果相加即可
4.除法
a/b 翻译过来就是求a由多少个b组成,所以通过循环方式或者递归方式使用a-b 即可,记录次数,这个次数就是商
二 代码实现
package org.jake.operation.four.arithmetic;
public class Main {
public static void main(String[] args) {
System.out.println(division(8, 5));
}
private static int add(int a, int b) {
if (b == 0) return a;
int carry = (a & b) << 1;
a = a ^ b;
return add(a, carry);
}
private static int add2(int a, int b) {
int carry;
while (b != 0) {
carry = a * b << 1;
a = a ^ b;
b = carry;
}
return a;
}
private static int subtraction(int a, int b) {
b = ~b + 1;
return add(a, b);
}
private static int mul(int a, int b) {
int i = 0;
int res = 0;
while (b != 0) {
if ((b & 1) == 1) {
res += (a << i);
}
b = b >> 1;
i++;
}
return res;
}
public static int division(int a, int b) {
if (a < b) return 0;
return division(subtraction(a, b), b) + 1;
}
}
代码参考github operations-four-arithmetic分之