1)位運算加法:oop
int a=3,b=4;url
while(b!=0){spa
num=a^b;.net
carry=a&b<<;code
a=num,b=carry;blog
}遞歸
最終a爲結果get
舉個例子:io
對於兩數二進制相加,不進位相加至關於異或num,指考慮進位計算爲與,並左移一位carry;當carry不爲0時表示有進位,將進位的數carry不進位「加」到num中,獲得新的num和carry;class
a = 0011, b = 1001;
start;
first loop;
1.1 sum = 1010
1.2 carry = 0010
1.3 carry != 0 , go on;
// 遞歸寫法 int add(int num1, int num2){ if(num2 == 0) return num1; int sum = num1 ^ num2; int carry = (num1 & num2) << 1; return add(sum, carry); } // 迭代寫法 int add(int num1, int num2){ int sum = num1 ^ num2; int carry = (num1 & num2) << 1; while(carry != 0){ int a = sum; int b = carry; sum = a ^ b; carry = (a & b) << 1; } return sum; }
2)減法運算:
經過加法器來實現減法器,即首先實現一個加法器,設爲add(int a,int b);
而後對兩個數num1,num2,num1-num2=num1+(-num2);對於一個數的負數在計算機中時取反再加1,即m_num2=add(~num2,1);而後add(num1,m_num2);
/* * num1: 減數 * num2: 被減數 */ int substract(int num1, int num2){ int subtractor = add(~num2, 1);// 先求減數的補碼(取反加一) int result = add(num1, subtractor); // add()即上述加法運算 return result ; }
3)乘法