1. 程式人生 > >[Java]實現簡單的a+b(位運算篇)

[Java]實現簡單的a+b(位運算篇)

實現簡單的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;
    }
}