使用mod运算符和移位符实现加减乘除

 加法实现:可以将加法分为三步,第一先将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就是所求乘积。

5*3=1001=1001+10010=11011=15 *0011

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);

    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值