def bitstring(x): return bin(x)[2:]
def printlongdiv(lhs, rhs):
rem = lhs
div = rhs
origlen = len(bitstring(div))
# first shift left until the leftmost bits line up.
count = 1
while (div | rem) > 2*div:
div <<= 1
count += 1
# now keep dividing until we are back where we started.
quot = 0
while count>0:
quot <<= 1
count -= 1
print("%14s" % bitstring(rem))
divstr = bitstring(div)
if (rem ^ div) < rem:
quot |= 1
rem ^= div
print(1, " " * (11-len(divstr)), divstr[:origlen])
else:
print(0, " " * (11-len(divstr)), "0" * origlen)
print(" " * (13-len(divstr)), "-" * origlen)
div >>= 1
print("%14s <<< remainder" % bitstring(rem))
print(" -> %10s <<< quotient" % bitstring(quot))
printlongdiv(50,3)
ZGVmIGJpdHN0cmluZyh4KTogIHJldHVybiBiaW4oeClbMjpdCmRlZiBwcmludGxvbmdkaXYobGhzLCByaHMpOgogICAgcmVtID0gbGhzCiAgICBkaXYgPSByaHMKICAgIG9yaWdsZW4gPSBsZW4oYml0c3RyaW5nKGRpdikpCgogICAgIyBmaXJzdCBzaGlmdCBsZWZ0IHVudGlsIHRoZSBsZWZ0bW9zdCBiaXRzIGxpbmUgdXAuCiAgICBjb3VudCA9IDEKICAgIHdoaWxlIChkaXYgfCByZW0pID4gMipkaXY6CiAgICAgICAgZGl2IDw8PSAxCiAgICAgICAgY291bnQgKz0gMQoKICAgICMgbm93IGtlZXAgZGl2aWRpbmcgdW50aWwgd2UgYXJlIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZC4KICAgIHF1b3QgPSAwCiAgICB3aGlsZSBjb3VudD4wOgogICAgICAgIHF1b3QgPDw9IDEKICAgICAgICBjb3VudCAtPSAxCiAgICAgICAgcHJpbnQoIiUxNHMiICUgYml0c3RyaW5nKHJlbSkpCiAgICAgICAgZGl2c3RyID0gYml0c3RyaW5nKGRpdikKICAgICAgICBpZiAocmVtIF4gZGl2KSA8IHJlbToKICAgICAgICAgICAgcXVvdCB8PSAxCiAgICAgICAgICAgIHJlbSBePSBkaXYKCiAgICAgICAgICAgIHByaW50KDEsICIgIiAqICgxMS1sZW4oZGl2c3RyKSksIGRpdnN0cls6b3JpZ2xlbl0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoMCwgIiAiICogKDExLWxlbihkaXZzdHIpKSwgIjAiICogb3JpZ2xlbikKICAgICAgICBwcmludCgiICIgKiAoMTMtbGVuKGRpdnN0cikpLCAiLSIgKiBvcmlnbGVuKQogICAgICAgIGRpdiA+Pj0gMQogICAgcHJpbnQoIiUxNHMgPDw8IHJlbWFpbmRlciIgJSBiaXRzdHJpbmcocmVtKSkKICAgIHByaW50KCIgLT4gJTEwcyA8PDwgcXVvdGllbnQiICUgYml0c3RyaW5nKHF1b3QpKQoKcHJpbnRsb25nZGl2KDUwLDMpCgoK