加法实现:可以将加法分为三步,第一先将a,b两数进行异或运算赋给t,a与b进行&运算并左移一位赋给b,最后将t赋a,检查b是否为0;若不为0,则对上述操作进行循环直至b为0,此时a为所求和。
public static int add(int m,int n) {
long num=m^n;
long temp=m&n;
while(temp!=0) {
long a=num;
temp<<=1;
num^=temp;
temp&=a;
}
if(num>Integer.MAX_VALUE)
return Integer.MAX_VALUE;
else if(num<Integer.MIN_VALUE)
return Integer.MIN_VALUE;
else
return (int)num;
}
减法计算:减去一个数等于加上这个数的补码,我们可以将后一个数进行补码操作,然后使用上述价法进行计算
public static int subtraction(int subtrahend,int subtraction) {
return add(subtrahend,add(~subtraction,1));
}
乘法计算:假设有a和b两个数,判断b数二进制上1的位置和最左边距离count,然后对a进行右移count操作;将每一个以为操作后的结果进行累加为num,当b为0时,num就是所求乘积。
public static int mutiply(int m, int n) {
long m1=Math.abs(m),m2=Math.abs(n);
long sign=((m1<0)^(m2<0))?-1:1;
int num=0;
Map<Integer,Integer> map=new HashMap<>();
map.put(1, 0);
while(m2>0) {
long count=1;
while((m2&1)==0) {
++count;
m2=m2>>1;
}
map.replace(1, (int) (map.get(1)+count));
num+=(m1<<(map.get(1))-1);
m2>>=count;
}
if(sign*num>Integer.MAX_VALUE)
return Integer.MAX_VALUE;
else if(sign*num<Integer.MIN_VALUE)
return Integer.MIN_VALUE;
else
return (int)(sign*num);
}
除法:除数每次右移移位判断是否大于被除数,小于的话将被除数减去移位后的除数,重复循环,每次count++;直至除数大于被除数。最终的count就是商。
public static int divide(int dividend, int divisor) {
if(divisor==0)
return Integer.MAX_VALUE;
long d1=Math.abs((long)dividend);
long d2=Math.abs((long)divisor);
long div=0;
long sign=((dividend<0)^(divisor<0))?-1:1;
while(d1>=d2) {
long tem=d2,t=1;
while(d1>(tem<<1)) {
tem<<=1;
t<<=1;
}
div+=t;
d1-=tem;
}
if(sign*div>Integer.MAX_VALUE)
return Integer.MAX_VALUE;
else if(sign*div<Integer.MIN_VALUE)
return Integer.MIN_VALUE;
else
return (int)(sign*div);
}