1. 程式人生 > 其它 >Java位運算實現加法

Java位運算實現加法

Java位運算實現加法

Java位運算實現加法

引數 1000,2000
0000 0000 0000 0000 0000 0011 1110 1000   1000
0000 0000 0000 0000 0000 0111 1101 0000   2000

先進行& 操作判定是否有進位
0000 0000 0000 0000 0000 0011 1100 0000 & 操作  
有進位左移一位
0000 0000 0000 0000 0000 0111 1000 0000 << 1   carryBit

引數 1000,2000
0000 0000 0000 0000 0000 0011 1110 1000   1000
0000 0000 0000 0000 0000 0111 1101 0000   2000
在將兩個值進行^ 異或運算
0000 0000 0000 0000 0000 0100 0011 1000 ^ 異或  result


0000 0000 0000 0000 0000 0111 1000 0000  carryBit
0000 0000 0000 0000 0000 0100 0011 1000  result

將進位和異或後的值進行& 操作判斷是否還有進位,沒有返回,有的話繼續遞迴
0000 0000 0000 0000 0000 0100 0000 0000  & 操作 
0000 0000 0000 0000 0000 1000 0000 0000  << 1   carryBit

0000 0000 0000 0000 0000 0111 1000 0000  carryBit
0000 0000 0000 0000 0000 0100 0011 1000  result
在將兩個值進行^ 異或運算
0000 0000 0000 0000 0000 0011 1011 1000 ^ 異或  result

將進位和異或後的值進行& 操作判斷是否還有進位,沒有返回,有的話繼續遞迴
0000 0000 0000 0000 0000 0011 1011 1000 result
0000 0000 0000 0000 0000 1000 0000 0000 carryBit

0000 0000 0000 0000 0000 1011 1011 1000 ^ 異或  result



java 程式碼實現

/**
 * @author: Mikael
 **/

public class Client {
    public static void main(String[] args) {
        System.out.println(recursion(1024, 1024));
    }

    // 遞迴
    public static int recursion(int i, int j) {
        //  0000 0000 0000 0000 0000 0000 0000 0101   5
        //  0000 0000 0000 0000 0000 0000 0000 0101   5
        //& 0000 0000 0000 0000 0000 0000 0000 0101   5
        //& 可以用來計算兩個數進行相加有無進位
        int carryBit = (i & j) << 1;
        //  0000 0000 0000 0000 0000 0000 0000 0101  5
        //  0000 0000 0000 0000 0000 0000 0000 0101  5
        //^ 0000 0000 0000 0000 0000 0000 0000 0000  0
        //^ 異或可以用來計算兩個數的加法不考慮進位
        int result = i ^ j;
        if (carryBit != 0){
            return recursion(result,carryBit);
        }
        return result;
    }
}