#include <stdio.h>
int bit[] = { 1<<0, 1<<1, 1<<2, 1<<3 };
struct fullAdderReturn
{
int sum;
int carryOut;
};
typedef struct fullAdderReturn FAR_t;
FAR_t oneBitAdder(int a, int b, int carryIn)
{
FAR_t output;
output.sum = a^b^carryIn;
output.carryOut = (a&b) | (a&carryIn) | (a&carryIn);
return output;
}
FAR_t twoBitAdder(int a, int b, int carryIn)
{
FAR_t output, temp;
output.sum = 0;
//add the least significant bits
temp = oneBitAdder(a&bit[0], b&bit[0], carryIn);
//set the sum
output.sum |= temp.sum << 0;
//add the next bits using carry from last add
temp = oneBitAdder(a&bit[1], b&bit[1], temp.carryOut);
//shift up the output and or it together with result of last add
output.sum |= ((temp.sum) << 1);
output.carryOut = temp.carryOut;
return output;
}
int main( void )
{
int a = 1;
int b = 1;
int carryIn = 1;
FAR_t t = twoBitAdder(a, b, carryIn);
printf("sum = %d, carryOut = %d\n", t.
sum, t.
carryOut);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgYml0W10gPSB7IDE8PDAsIDE8PDEsIDE8PDIsIDE8PDMgfTsKCnN0cnVjdCBmdWxsQWRkZXJSZXR1cm4KewogICAgaW50IHN1bTsKICAgIGludCBjYXJyeU91dDsKfTsKCnR5cGVkZWYgc3RydWN0IGZ1bGxBZGRlclJldHVybiBGQVJfdDsKCkZBUl90IG9uZUJpdEFkZGVyKGludCBhLCBpbnQgYiwgaW50IGNhcnJ5SW4pCnsKICAgIEZBUl90IG91dHB1dDsKICAgIG91dHB1dC5zdW0gPSBhXmJeY2FycnlJbjsKICAgIG91dHB1dC5jYXJyeU91dCA9IChhJmIpIHwgKGEmY2FycnlJbikgfCAoYSZjYXJyeUluKTsKICAgIAogICAgcmV0dXJuIG91dHB1dDsKfQoKRkFSX3QgdHdvQml0QWRkZXIoaW50IGEsIGludCBiLCBpbnQgY2FycnlJbikKewogICAgRkFSX3Qgb3V0cHV0LCB0ZW1wOwogICAgb3V0cHV0LnN1bSA9IDA7CiAgICAKICAgIC8vYWRkIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzCiAgICB0ZW1wID0gb25lQml0QWRkZXIoYSZiaXRbMF0sIGImYml0WzBdLCBjYXJyeUluKTsKCiAgICAvL3NldCB0aGUgc3VtCiAgICBvdXRwdXQuc3VtICB8PSB0ZW1wLnN1bSA8PCAwOwogICAgCiAgICAvL2FkZCB0aGUgbmV4dCBiaXRzIHVzaW5nIGNhcnJ5IGZyb20gbGFzdCBhZGQKICAgIHRlbXAgPSBvbmVCaXRBZGRlcihhJmJpdFsxXSwgYiZiaXRbMV0sIHRlbXAuY2FycnlPdXQpOwoKICAgIC8vc2hpZnQgdXAgdGhlIG91dHB1dCBhbmQgb3IgaXQgdG9nZXRoZXIgd2l0aCByZXN1bHQgb2YgbGFzdCBhZGQKICAgIG91dHB1dC5zdW0gfD0gKCh0ZW1wLnN1bSkgPDwgMSk7CiAgICBvdXRwdXQuY2FycnlPdXQgPSB0ZW1wLmNhcnJ5T3V0OwogICAgCiAgICByZXR1cm4gb3V0cHV0Owp9CgppbnQgbWFpbiggdm9pZCApCnsKICAgIGludCBhID0gMTsKICAgIGludCBiID0gMTsKICAgIAogICAgaW50IGNhcnJ5SW4gPSAxOwoKICAgIAogICAgRkFSX3QgdCA9IHR3b0JpdEFkZGVyKGEsIGIsIGNhcnJ5SW4pOwogICAgCiAgICBwcmludGYoInN1bSA9ICVkLCBjYXJyeU91dCA9ICVkXG4iLCB0LnN1bSwgdC5jYXJyeU91dCk7CiAgICAKICAgIHJldHVybiAwOwp9