位运算-实现加减乘除

基本性质: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));
    }

测试结果:

  

 

posted @ 2019-01-10 18:42  |旧市拾荒|  阅读(613)  评论(0编辑  收藏  举报