一、加法
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 }
