本系列導(dǎo)航:劍指offer(第二版)java實現(xiàn)導(dǎo)航帖
面試題65:不用加減乘除做加法
題目要求:
寫一個函數(shù)臂痕,求兩個正數(shù)之和宋光,要求在函數(shù)體內(nèi)不能使用四則運算符號关斜。
解題思路:
不能用四則運算,那只能通過位運算了秘通。其實四則運算是針對十進制为严,位運算是針對二進制,都能用于運算肺稀。下面以0011(即3)與0101(即5)相加為例說明
1.兩數(shù)進行異或: 0011^0101=0110 這個數(shù)字其實是把原數(shù)中不需進位的二進制位進行了組合
2.兩數(shù)進行與: 0011&0101=0001 這個數(shù)字為1的位置表示需要進位第股,而進位動作是需要向前一位進位
3.左移一位: 0001<<1=0010
此時我們就完成0011 + 0101 = 0110 + 0010的轉(zhuǎn)換
如此轉(zhuǎn)換下去,直到其中一個數(shù)字為0時话原,另一個數(shù)字就是原來的兩個數(shù)字的和
代碼實現(xiàn)如下
package chapter6;
/**
* Created with IntelliJ IDEA
* Author: ryder
* Date : 2017/8/20
* Time : 21:03
* Description:不用加減乘除做加法
**/
public class P310_AddTwoNumbers {
public static int add(int a,int b){
int sum = a^b;
int carry = (a&b)<<1;
int temp;
while (carry!=0){
temp = sum;
sum = sum^carry;
carry = (carry&temp)<<1;
}
return sum;
}
public static void main(String[] args){
System.out.println(add(3,5)); //8
System.out.println(add(3,-5)); //-2
System.out.println(add(0,1)); //1
}
}
運行結(jié)果
8
-2
1