码迷,mamicode.com
首页 > 其他好文 > 详细

位运算-实现加减乘除

时间:2019-01-10 19:34:31      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:记录   oid   src   获取   除法   res   ++i   ==   strong   

基本性质:1:~n=-(n+1),比如:~3=-4
        2:获取整数n的二进制串中最后一个1:-n&n=~(n-1)&n
        3:去掉整数n的二进制串中最后一个1:n&(n-1)

加法:(以下所有代码都是Java实现)

  public static int add(int a,int b) {
        int res=a;
        int xor=a^b;  // a^b得到原位和(相当于按位相加没有进位)
        int forward=(a&b)<<1;//得到进位和   a&b:得到产生进位的地方 (a&b)<<1:进位后的值
        if(forward!=0){//若进位和不为0,则递归求原位和+进位和
            res=add(xor, forward);
        }else{
            res=xor;//若进位和为0,则此时原位和为所求和
        }
        return res;                
    }

减法:

  public static int minus(int a,int b) {
        int B=~(b-1);  // 由上面基本性质   -b=+(-b),~(b-1)=-b  ===>>>  a-b=a+(-b)=a+(~(b-1)
        return add(a, B);        
    }

乘法:

  public static  int multi(int a,int b){
		/*	   1011
		 	*  1010
		   --------
  			  10110 (1011<<1,相当于乘以0010)
			1011000 (1011<<3,相当于乘以1000)
			--------
			1101110
		*/
        int i=0;
        int res=0;
        while(b!=0){//乘数为0则结束
            //处理乘数当前位
            if((b&1)==1){
                res+=(a<<i);
                b=b>>1;
                ++i;//i记录当前位是第几位
            }else{
                b=b>>1;
                ++i;
            }
        }
        return res;
    }

除法:

  public static  int sub(int a,int b) {
		// 除法的意义就在于:求a可以由多少个b组成。那么由此我们可得除法的实现:求a能减去多少个b,做减法的次数就是除法的商。
        int res=-1;
        if(a<b){
            return 0;
        }else{
            res=sub(minus(a, b), b)+1;
        }
        return res;
    }

测试代码:

  public static void main(String args[]){
		System.out.println("加法测试:"+add(10, 5));
		System.out.println("减法测试:"+minus(10, 5));
		System.out.println("乘法测试:"+multi(10, 5));
		System.out.println("除法测试:"+sub(10, 5));
    }

测试结果:

  技术分享图片

 

位运算-实现加减乘除

标签:记录   oid   src   获取   除法   res   ++i   ==   strong   

原文地址:https://www.cnblogs.com/xiaoyh/p/10251731.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!