17.1 Add Without Plus: Write a function that adds two numbers. You should not use + or any arithmetic operators.
• Implemented a full adder from scratch (min SOP through K-maps)
// initially I pushed back the bits into a vector
// this isnt the entire solution to the problem
// I've left the sum vector for learning purposes when I look back
vector<int> sum(int a, int b) {
int c_in = 0;
vector<int> c_out;
vector<int> sum;
int s;
int temp;
int count = 0;
c_out.push_back(c_in);
int bit_a, bit_b;
while (b != 0 || a != 0) {
// look only at first bit
bit_a = a & 1;
bit_b = b & 1;
// add bits using min SOP
/*
sum.push_back((!bit_a && bit_b && !c_out.at(count)) ||
(!bit_a && !bit_b && c_out.at(count)) ||
(bit_a && !bit_b && !c_out.at(count)) ||
(bit_a && bit_b && c_out.at(count)));
*/
// equivalent
sum.push_back(bit_a ^ bit_b ^ c_out.at(count));
// find next c_out
c_out.push_back((bit_b && c_out.at(count)) || (bit_a && bit_b) || (bit_a && c_out.at(count)));
count++;
// look at next bit
a = a >> 1; b = b >> 1;
}
sum.push_back(c_out.at(count));
return sum;
}
// clean version
int add(int a, int b) {
int c_in, c_out, s, final_s, base;
c_in = c_out = final_s = base = 0;
// s = current bit sum
// final_s = current bit sum + previous sum
int bit_a, bit_b;
while (b != 0 || a != 0) {
// look only at first bit
bit_a = a & 1;
bit_b = b & 1;
// sum bits
s = bit_a ^ bit_b ^ c_out;
// find next c_out
c_out = (bit_b && c_out) || (bit_a && bit_b) || (bit_a && c_out);
// concatinate current bit to prev bit to form an actual number with significant base
final_s = (s << base++) | final_s;
// look at next bit
a = a >> 1; b = b >> 1;
}
final_s = (c_out << base++) | final_s;
return final_s;
}
int main()
{
//vector<int> s = sum(10, 10);
//for (int i = s.size() - 1; i >= 0; i--) cout << s.at(i);
//cout << endl;
//s = sum(5, 10);
//for (int i = s.size() - 1; i >= 0; i--) cout << s.at(i);
//cout << endl;
//s = sum(10, 7);
//for (int i = s.size() - 1; i >= 0; i--) cout << s.at(i);
//cout << endl;
cout << add(10, 10) << endl;
cout << add(7, 10) << endl;
cout << add(20, 10) << endl;
cout << add(45, 3) << endl;
}