Sum of two integers
Problem
Write a function that add two numbers A and B. You should not use + or any arithmetic operators.
Notice: There is no need to read data from standard input stream. Both parameters are given in function aplusb, you job is to calculate the sum and return it.
Clarification
Are a and b both 32-bit integers? Yes.
Can I use bit operation? Sure you can.
Example
Given a = 1 and b = 2 return 3
Challenge
Of course you can just return a + b to get accepted. But Can you challenge not do it like that?
Solution
+ is not allowed to use, however we can directly manipulate bits to simulate the plus operation.
In its binary format, 1 + 0 will be 1, 0 + 0 will be 0, 1 + 1 will become 0, and the carry becomes 1. So the result without carry can be calculated by xor a ^ b, and the carry a & b, if carry is not 0, shift it left by 1, and add again:
while(b != 0) {
int carry = a & b;
a = a ^ b;
b = carry << 1;
}
For example, a = 1 (binary as 1), b = 3 (binary as 11)
====== Iteration #1 ======
a = 1
b = 11
carry(a & b) = 1
new a(a ^ b) = 10
new b(shifted carry) = 10
====== Iteration #2 ======
a = 10
b = 10
carry(a & b) = 10
new a(a ^ b) = 0
new b(shifted carry) = 100
====== Iteration #3 ======
a = 0
b = 100
carry(a & b) = 0
new a(a ^ b) = 100
new b(shifted carry) = 0
Final Result: 4
How about negative numbers?
Since negative numbers are in the form of Two's Complement, they can be treated in the same way. For example a = 1, b = -3:
====== Iteration #1 ======
a = 1
b = 11111111111111111111111111111101
carry(a & b) = 1
new a(a ^ b) = 11111111111111111111111111111100
new b(shifted carry) = 10
====== Iteration #2 ======
a = 11111111111111111111111111111100
b = 10
carry(a & b) = 0
new a(a ^ b) = 11111111111111111111111111111110
new b(shifted carry) = 0
Final Result: -2