實現簡單的a+b
說明
a和b都是 32位
整數麼?
- 是的
我可以使用位運算符麼?
- 當然可以
樣例
如果 a=1
並且 b=2
,返回3
。
挑戰
顯然你可以直接 return a + b,但是你是否可以挑戰一下不這樣做?(不使用 "+" 等算數運算符)
當然, 我們的目標就是這個挑戰.
如果是有基礎的小夥伴, 一定會瞬間想到, 我們可以使用位運算啊, 對, 我們就要是用位運算來解決這個問題.
我將會通過三個例子來分析如何推算出計算過程的.
//我們如何知道需要進位呢? 1+1
/*
A: 0000 0001
B: 0000 0001
我們需要得知這麼一個情況, 就是什麼時候我們需要進位, 當然, 在二進制中, 滿2進1,
我們需要標記這種情況
在三種按位運算符(&, |, ^)中, 顯然 A & B 符合這種情況
A & B: 0000 0001
當 A 和 B某一位相同的時候(都是1), 那麼下次計算的時候就需要進位
*/
//那麼我們怎麼知道無需進位呢? 1+2
/*
A: 0000 0001
B: 000000010
當我們進行 A & B 操作後我們發現:
A & B: 0000 0000
也就是 A & B == 0 的時候, 這時候根本不需要進位
*/
//無需進位的時候,我們怎麼得到結果呢? 1+2
/*
A: 0000 0001
B: 0000 0010
當我們 A & B 後發現:
A & B: 0000 0000 => A & B == 0
這時不需要我們進位, 那我我們該如何得出結果呢?
當然是某一位是 1 的時候, 我們需要保存下來, 這時候需要 "^" 運算符發揮它的功效了
我們會得到:
A ^ B: 0000 0011 => 3
這時候我們得到了我們想要的值.
*/
//需要進位的時候, 我們如何的得到結果呢? 1+3
/*
A: 0000 0001
B: 0000 0011
我們首先通過 A & B 得到
A & B: 0000 0001 => 我們得知, 最後一位需要進位
那麼我們通過 "<<" 運算符可以得到一個進位後的值 C:
C = (A & b) << 1 => C: 0000 0010
然後我們通過 A ^ B 得到
A ^ B: 0000 0010 => 這是"原值"不需要進位的部分, 我們賦值給D:
D = (A ^ B)
這時候, 我們需要拿已經做了進位操作的 C, 以及之前保留的部分 D 重複以上操作
直到 val_A & val_B == 0 的時候, 就說明計算完成了
*/
最後附上Java版的代碼:
//最後附上Java版的代碼
public class Solution {
/**
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
public int aplusb(int a, int b) {
// write your code here
int m_ay = a & b;
int m_yh = a ^ b;
while(m_ay > 0) {
int t_a = m_yh;
int t_b = m_ay << 1;
m_ay = t_a & t_b;
m_yh = t_a ^ t_b;
}
return m_yh;
}
}