1. 程式人生 > >位運算-實現加減乘除

位運算-實現加減乘除

res oid font ont 分享圖片 != family highlight args

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

測試結果:

  技術分享圖片

位運算-實現加減乘除