位運算-實現加減乘除

基本性質:1:~n=-(n+1),好比:~3=-4
        2:獲取整數n的二進制串中最後一個1:-n&n=~(n-1)&n
        3:去掉整數n的二進制串中最後一個1:n&(n-1)html

加法:(如下全部代碼都是Java實現)java

?
1
2
3
4
5
6
7
8
9
10
11
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;               
   }

減法:post

?
1
2
3
4
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);       
   }

乘法:測試

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
   }

除法:spa

?
1
2
3
4
5
6
7
8
9
10
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;
   }

測試代碼:code

?
1
2
3
4
5
6
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 ));
   }

測試結果:htm

  

 

 

出處:https://www.cnblogs.com/xiaoyh/p/10251731.htmlblog

相關文章
相關標籤/搜索