# Given two positive integers, return their sum without + operator

Problem statement is simple. Given two positive integers, return their sum without + operator. Reference: leetcode.com/problems/add-binary

Input: 5, 6

Output: 11

```
#include <stdint.h>
uint32_t Add(uint32_t x, uint32_t y)
{
uint32_t sum = 0;
//Implement logic
return sum;
}
```

Actual intention of this problem is if you can implement Add function with logic gates. Let's think about truth table for half adder.

*Half Adder Truth Table*

From truth table, you can find out **carry = x & y** and **sum = x ^ y**. However, we cannot use carry after just &. To take care of carry into result, it should be shifted 1 to left and add with next input bit iteration. This iteration will keep going until new carry is zero. Therefore, carry formula is **(x & y) << 1**

*Algorithm with an example*

*Implementation and test*

Created half_adder ceedling project

`ceedling module:create[half_adder]`

half_adder.h

`#ifndef HALF_ADDER_H #define HALF_ADDER_H #include <stdint.h> uint32_t Add(uint32_t x, uint32_t y); #endif // HALF_ADDER_H`

half_adder.c

`#include "half_adder.h" uint32_t Add(uint32_t x, uint32_t y) { uint32_t sum; uint32_t carry; do { sum = x ^ y; carry = (x & y) << 1; x = sum; y = carry; } while (carry != 0); return sum; }`

test_half_adder.c

`#include "unity.h" #include "half_adder.h" void setUp(void) { } void tearDown(void) { } void test_half_adder_input5and6(void) { uint32_t x = 5; uint32_t y = 6; TEST_ASSERT_EQUAL(x+y, Add(x,y)); }`

run test and result

`ceedling test:half_adder`

*Sample test case is not enough?*

Yes, it is not enough because there are 4 cases with carry = 0 and another 4 cases with carry = 1. Example input 5 and 6 won't cover all those 8 cases. To prove the algorithm, you need to cover all 8 cases as minimum. I was able to derive two inputs to cover all 8 cases shown below:

Add test case in test_half_adder.c and re-test

```
void test_half_adder_input428and362(void)
{
uint32_t x = 428;
uint32_t y = 362;
TEST_ASSERT_EQUAL(x+y, Add(x,y));
}
```