本系列導(dǎo)航:劍指offer(第二版)java實(shí)現(xiàn)導(dǎo)航帖
面試題65:不用加減乘除做加法
題目要求:
寫一個(gè)函數(shù),求兩個(gè)正數(shù)之和,要求在函數(shù)體內(nèi)不能使用四則運(yùn)算符號。
解題思路:
不能用四則運(yùn)算,那只能通過位運(yùn)算了。其實(shí)四則運(yùn)算是針對十進(jìn)制,位運(yùn)算是針對二進(jìn)制,都能用于運(yùn)算。下面以0011(即3)與0101(即5)相加為例說明
1.兩數(shù)進(jìn)行異或: 0011^0101=0110 這個(gè)數(shù)字其實(shí)是把原數(shù)中不需進(jìn)位的二進(jìn)制位進(jìn)行了組合
2.兩數(shù)進(jìn)行與: 0011&0101=0001 這個(gè)數(shù)字為1的位置表示需要進(jìn)位,而進(jìn)位動(dòng)作是需要向前一位進(jìn)位
3.左移一位: 0001<<1=0010
此時(shí)我們就完成0011 + 0101 = 0110 + 0010的轉(zhuǎn)換
如此轉(zhuǎn)換下去,直到其中一個(gè)數(shù)字為0時(shí),另一個(gè)數(shù)字就是原來的兩個(gè)數(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
}
}
運(yùn)行結(jié)果
8
-2
1