給出兩個整數 a 和 b , 求他們的和
1.題目
給出兩個整數a和b,求他們的和。
2.思考
a+b,我們不管使用什麼語言a+b都是很容易實現的比如常見的java,該算法可以直接 return (a + b);該算法已經完成。如此簡單肯定不是隻有這樣的,
3.代碼實現:
1.非遞歸實現
public int aplusb(int a, int b) {
int carrySum, originalSum;
//a ^ b 是不進位的原位和
//a & b 產生進位的地方
//a & b << 1 是進位和
//當進位和等於0時,原位和就是a+b的和
//如果進位和不等於0時,a = 原味和,b = 進位和,繼續按照如上
//方式進行計算,直到進位和爲0
while (b != 0){
carrySum = a ^ b;
originalSum = (a & b) << 1;
a = carrySum;
b = originalSum;
}
return a;
}
2.遞歸實現
public int aplusb(int a, int b) {
//遞歸實現
if (b == 0){
return a;
}
return aplusb((a ^ b),((a & b) << 1));
}
4.瞭解一下位運算
位運算時對字節或字中的實際位進行檢測、設置或者移位,它只適用於字符型和整數型變量及他們的變體,對其他數據類型不適用
① 、&:位運算邏輯與
邏輯與的運算規則:當進行兩個數的邏輯與運算時,先將他們轉化爲二進制,然後進行邏輯與運算,當相同位的數只有雙方都爲1時結果才爲1,否則爲0
②、 |:位運算邏輯或
邏輯或的運算規則:當進行兩個數的邏輯或運算時,先將兩個數轉化爲二進制,然後進行邏輯或運算,當相同位的數只要有一方爲1結果就爲1,否則爲0
③、 ^: 位運算邏輯異或
邏輯異或運算規則:當進行兩個數的邏輯異或時先將兩個數轉化爲二進制,然後進行邏輯異或運算,當相同位的數只有當雙方都爲不同數字時結果纔是1,否則爲0
④、 ~: 位運算反
邏輯反的運算規則:當進行一個數的邏輯反運算時,先將這個數轉化爲二進制,然後進行邏輯反運算,當數爲1時結果爲0,當數爲0時結果爲1
⑤、 >>: 右移
右移操作運算規則:左邊空出的位用0或者1補,正數用0補,負數用1填補。
當一個數進行n位的右移操作後所得到的新的數=被操作數/2^n
⑥、 <<: 左移
左移運算操作規則:右邊空出的位用0補,高位左移溢出則捨棄該高位。
當一個數進行n位左移操作之後,所得到的新的數=被操作數*2^n
5.位運算加法
1.a^b 是按位相加後沒有進位的和
2.a&b 是產生進位的地方
3.(a&b) << 1 的到進位後的值
4.按位相加後原位和+進位和就是加法的和,依次計算直到進位和爲0之後。