#include <iostream>
#include <bitset>
#include <cstdio>
 
template <size_t N>
std::bitset<N> sum (const std::bitset<N>& b1, const std::bitset<N>& b2) {
    std::bitset<N> result;
    bool carry = false;
    for (size_t i = 0 ; i < N ; ++i) {
        unsigned value = b1[i] + b2[i] + (carry ? 1 : 0);
        carry = value > 1;
        result[i] = value % 2;
        std::printf ("[%d] %d %d -> %d (%d)\n", (int)i, b1[i], b2[i], (bool)result[i], carry);
    }
    return result;
}
 
int main () {
    std::bitset<10> first(20);
    std::bitset<10> second (15);
    std::cout << sum (first, second).to_ulong() << std::endl;
}