Java位運算實現加減乘除


一、加法

a+b

舉例實現:13+9=22

13+9不考慮進位結果為12

只考慮進位結果為10

和剛好是22。

13二進制為1101,9二進制為1001。

不考慮進位結果為0100。算式為a^b

只考慮進位結果為10010。算式為(a&b)<< 1

然后它倆繼續進行運算,直到進位為0。

算法實現:

 1 //兩種方式:
 2     //1、遞歸形式實現
 3     int add(int a ,int b){
 4         if (b == 0)
 5             return a;
 6         else{
 7             //進位值
 8             int carry = (a & b) << 1;
 9             a = a ^b;
10             return add(a,carry);
11         }
12     }
13 
14     //非遞歸形式實現
15     int add2(int a ,int b){
16         //進位值
17         int carry;
18         while (b != 0){
19             carry = (a & b) << 1;
20             a = a ^b;
21             b = carry;
22         }
23         return a;
24     }

二、減法

a-b

先來證明一個等式。Java負數存儲是以補碼形式存儲的(補碼=反碼+1)。所以反碼=補碼-1.即~n=-n-1=-(n+1)

所以a-b可以化簡為a+(-b)=a+~b+1

算法實現:

1 //減法實現 a+(-b)=a+~b+1
2     int subtraction(int a ,int b){
3         b = ~b+1;
4         return this.add(a,b);
5     }

三、乘法

a*b

舉例說明:

  可以看到,二進制乘法的原理是:從乘數的低位到高位,遇到1並且這個1在乘數的右起第i(i從0開始數)位,那么就把被乘數左移i位得到 temp_i 。直到乘數中的1遍歷完后,把根據各位1而得到的被乘數的左移值們 temp_i 相加起來即得乘法結果。那么根據這個原理,可以得到實現代碼:這里要點為:用i記錄當前遍歷的乘數位,當前位為1則被乘數左移i位並加到和中,同時i++處理下一位;為0則乘數右移,i++,處理下一位......直到乘數==0說明乘數中的1遍歷完了。此時把和返回即可。

算法實現:

 1 //乘法實現
 2     //a 被乘數,b 乘數
 3     int multiplication(int a,int b){
 4         int i = 0;
 5         int res = 0;
 6         //乘數不為0
 7         while (b != 0){
 8             //處理當前位
 9             //當前位是1
10             if ((b & 1) == 1){
11                 res += (a << i);
12                 b = b >> 1;
13                 //記錄當前是第幾位
14                 i++;
15             }else {
16                 //當前位是0
17                 b = b >> 1;
18                 i++;
19             }
20         }
21         return res;
22     }

四、除法

a/b

除法的意義就在於:求a可以由多少個b組成。那么由此我們可得除法的實現:求a能減去多少個b,做減法的次數就是除法的商。

 1 //除法實現
 2     int division(int a,int b){
 3         int res;
 4         if(a<b){
 5             return 0;
 6         }else{
 7             res=division(subtraction(a, b), b)+1;
 8         }
 9         return res;
10     }

五、測試用例

 1 package bitOperation;
 2 
 3 /**
 4  * @author zsh
 5  * @company wlgzs
 6  * @create 2019-02-15 9:46
 7  * @Describe 位運算實現加減乘除操作
 8  */
 9 public class Test {
10     //兩種方式:
11     //1、遞歸形式實現
12     int add(int a ,int b){
13         if (b == 0)
14             return a;
15         else{
16             //進位值
17             int carry = (a & b) << 1;
18             a = a ^b;
19             return add(a,carry);
20         }
21     }
22 
23     //非遞歸形式實現
24     int add2(int a ,int b){
25         //進位值
26         int carry;
27         while (b != 0){
28             carry = (a & b) << 1;
29             a = a ^b;
30             b = carry;
31         }
32         return a;
33     }
34 
35     //減法實現 a+(-b)=a+~b+1
36     int subtraction(int a ,int b){
37         b = ~b+1;
38         return this.add(a,b);
39     }
40 
41     //乘法實現
42     //a 被乘數,b 乘數
43     int multiplication(int a,int b){
44         int i = 0;
45         int res = 0;
46         //乘數不為0
47         while (b != 0){
48             //處理當前位
49             //當前位是1
50             if ((b & 1) == 1){
51                 res += (a << i);
52                 b = b >> 1;
53                 //記錄當前是第幾位
54                 i++;
55             }else {
56                 //當前位是0
57                 b = b >> 1;
58                 i++;
59             }
60         }
61         return res;
62     }
63 
64     //除法實現
65     int division(int a,int b){
66         int res;
67         if(a<b){
68             return 0;
69         }else{
70             res=division(subtraction(a, b), b)+1;
71         }
72         return res;
73     }
74 
75     public static void main(String[] args) {
76         System.out.println(new Test().add(100,8));
77         System.out.println(new Test().subtraction(100,8));
78         System.out.println(new Test().multiplication(-3,3));
79         System.out.println(new Test().division(100,3));
80     }
81 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM