This adds integers using bit-wise operations. I tried to provide a lot of print statements so that you could see what’s going on with each step.
def decbin(x): # printing helper return x, bin(x) def add(a, b): running_sum = 0 carry = 0 k = 1 temp_a = a temp_b = b while temp_a or temp_b: print(" temp_a {:2d} {}".format(*decbin(temp_a))) print(" temp_b {:2d} {}".format(*decbin(temp_b))) print(" k {:2d} {}".format(*decbin(k))) # k masks a and b, returning the digits from right to left ak = a & k bk = b & k print(" ak {:2d} {}".format(*decbin(ak))) print(" bk {:2d} {}".format(*decbin(bk))) print(" ak & bk {:2d} {}".format(*decbin(ak & bk))) print(" ak ^ bk {:2d} {}".format(*decbin(ak ^ bk))) running_sum |= ak ^ bk ^ carry carry = (ak & bk) | (ak & carry) | (bk & carry) print(" carry {:2d} {:12} (ak & bk) | (ak & carry) | (bk & carry)".format(*decbin(carry))) print(" ak ^ bk ^ carry {:2d} {}".format(*decbin(ak ^ bk ^ carry))) print(" running_sum {:2d} {:12} |= ak ^ bk ^ carry".format(*decbin(running_sum))) # carry_in and k are shifted up each iteration carry <<= 1 k <<= 1 # temp_a and temp_b are shifted down each iteration temp_a >>= 1 temp_b >>= 1 print() print(" carry {:2d} {:12}".format(*decbin(carry))) print(" running_sum | carry {:2d} {}".format(*decbin(running_sum | carry))) return running_sum | carry
For example,
add(2,3)
temp_a 2 0b10 temp_b 3 0b11 k 1 0b1 ak 0 0b0 bk 1 0b1 ak & bk 0 0b0 ak ^ bk 1 0b1 carry 0 0b0 (ak & bk) | (ak & carry) | (bk & carry) ak ^ bk ^ carry 1 0b1 running_sum 1 0b1 |= ak ^ bk ^ carry temp_a 1 0b1 temp_b 1 0b1 k 2 0b10 ak 2 0b10 bk 2 0b10 ak & bk 2 0b10 ak ^ bk 0 0b0 carry 2 0b10 (ak & bk) | (ak & carry) | (bk & carry) ak ^ bk ^ carry 2 0b10 running_sum 1 0b1 |= ak ^ bk ^ carry carry 4 0b100 running_sum | carry 5 0b101