题目:
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路:
101 ^ 111 = 0010 (没有处理进位的加法)
(101 & 111) << 1 = 101 << 1 = 1010 (此处得到哪一位需要加上进位,为1的地方表示有进位需要加上)
0010 ^ 1010 = 1000 (没有处理进位的加法 + 进位 = 没有处理进位的加法)
(0010 & 1010) << 1 = 0010 << 1 = 00100 (查看是否有新的进位需要处理)
1000 ^ 00100 (没有处理进位的加法 + 进位 = 没有处理进位的加法)
(1000 & 00100) << 1 = 00000 << 1 = 000000 (进位为0,所以没有要处理的进位了)
Java
package nowcoder;
public class S48_Add {
//利用位运算
public int add(int num1, int num2){
while (num2 != 0){
int tmp = num1 ^ num2;//除进位的结果
num2 = (num1 & num2) << 1;//进位的结果
num1 = tmp;
}
return num1;
}
public static void main(String[] args){
S48_Add s48 = new S48_Add();
System.out.println(s48.add(12, 14));
}
}
Python
class Add:
def Add(self, num1, num2):
if not num1:
return num2
if not num2:
return num1
while num2 != 0:
n1 = num1 ^ num2
n2 = (num1 & num2) <<1
num1 = n1 & 0xFFFFFFFF
num2 = n2
return n1 if num1 >> 31 == 0 else num1 - 4294967296
if __name__ == '__main__':
test = Add()
print(test.Add(12, 15))