[LintCode] A + B Problem
Write a function that add two numbers A and B. You should not use +
or any arithmetic operators.
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.
Are a and b both 32-bit
integers?
- Yes.
Can I use bit operation?
- Sure you can.
Given a=1
and b=2
return 3
Of course you can just return a + b to get accepted. But Can you challenge to not do it like that?
Analysis: When adding two bits, we have the following 3 cases. These cases can be generalized in two steps. 1. add two bits. 2. add carry bit if any to the next higher bit.
0 + 0 = 0, carry = 0
0 + 1 = 1, carry = 0
1 + 1 = 0, carry = 1
Consider two bitwise operators: bitwise and &, bitwise exclusive or ^.
0 ^ 0 = 0 0 & 0 = 0
0 ^ 1 = 1 0 & 1 = 0
1 ^ 1 = 0 1 & 1 = 1
^ operation matches step 1 adding two bits ignoring carry bits. & operation matches step 2 adding carry bits.
As a result, we can separate the above two steps by doing the following.
a ^ b represents adding all bits together ignoring all the carry bits.
(a & b) << 1 represents the addition result with only carry bits info. Each carry bit needs to be left shifted 1 bit to be at the right position.
After each round, we get two new numbers to add. Repeat this process until there is no carry bits.
class Solution { public int aplusb(int a, int b) { while(b != 0){ int _a = a ^ b; int _b = (a & b) << 1; a = _a; b = _b; } return a; } }