劍指48.不用加減乘除做加法
阿新 • • 發佈:2020-08-28
題目描述
寫一個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算子號。思路
對數字做運算,除四則運算之外,只剩下位運算了。
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(intnum1,int num2) { while (num2 != 0){ int sum = num1 ^ num2; // 沒進位的和 int carry = (num1 & num2) << 1; // 進位 num1 = sum; num2 = carry; } return num1; } }
相關問題
不使用新的變數,交換兩個變數的值。
思路:兩種方法 1)基於加減法;2)基於異或運算。
// 常規寫法 privatevoid 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) 不用加減乘除做加法