1. 程式人生 > 實用技巧 >劍指48.不用加減乘除做加法

劍指48.不用加減乘除做加法

題目描述

寫一個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算子號。

思路

對數字做運算,除四則運算之外,只剩下位運算了。

  1)不考慮進位對每一位相加:1加0,0加1都等於1,而0加0,1加1等於0,所以使用異或^操作;

  2)計算進位:只有1加1產生進位,所以採用位與&操作,再左移1位;

  3)將和與進位相加,即重複前兩步操作。結束判斷為進位為0。

以5 + 7為例,1)不考慮進位相加後為 101+111=010;2)計算進位。101+111=1010;3)010+1010=1100 即為12

解法

public class Solution {
    public int Add(int
num1,int num2) { while (num2 != 0){ int sum = num1 ^ num2; // 沒進位的和 int carry = (num1 & num2) << 1; // 進位 num1 = sum; num2 = carry; } return num1; } }

相關問題

不使用新的變數,交換兩個變數的值。

思路:兩種方法 1)基於加減法;2)基於異或運算。

    // 常規寫法
    private
void swap(int[] arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j]= temp; } // 基於加減法 /*private void swap(int[] arr, int i, int j){ arr[i] = arr[i] + arr[j]; arr[j] = arr[i] - arr[j]; arr[i] = arr[i] - arr[j]; }*/ // 基於異或運算 /*
private void swap(int[] arr, int i, int j){ arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; arr[i] = arr[i] ^ arr[j]; }*/

參考:

【Java】 劍指offer(65) 不用加減乘除做加法