[Java]實現簡單的a+b(位運算篇)
阿新 • • 發佈:2019-01-03
實現簡單的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;
}
}