from __future__ import print_function
try:
    input = raw_input
except:
    pass

from operator import iadd, imul, idiv, imod, isub

oper = dict(zip('+*/%-', (iadd, imul, idiv, imod, isub)))

def get_bin(prompt='Bin value'):
    while True:
        try:
            return int(input('%s: ' % prompt),2)
        except ValueError:
            print('Please  enter string of 0 or 1 digits')

def get_op(prompt='Give operator'):
    while True:
        try:
            op = input('%s (%s): ' % (prompt, ''.join(oper.keys()))).strip()
            assert op in oper
            return op
        except AssertionError:
            print('You must give one of the operators!')

if __name__ == '__main__':
    first = get_bin('Give first binary number')
    second = get_bin('Give second binary number')
    op = get_op()

    result = oper[op](first,second)
    
    fl = max(len(bin(b)) for b in (first, second, result))
    sl = fl - 2
    sep = '-' * fl
    print('''
    {first:>{fl}b}
    {op} {second:>{sl}b}
    {sep}
    {result:>{fl}b}
    '''.format(**locals()))

Specialties:
IT/Science/Contracts/Religious translation/interpreting FIN-ENG-FIN
Python programming

Interesting, however the get_op() method won't work if python is run in optimized mode (python -O) because this mode removes assert statements. Assert statements should not influence the program's flow of control, except for debugging purposes.

Thanks, so then better to change to traditional if.. return there, also Python3 has not idiv(nor div), so I changed it to floordiv:

from __future__ import print_function
try:
    input = raw_input
except:
    pass

from operator import iadd, imul, floordiv, imod, isub

oper = dict(zip('+*/%-', (iadd, imul, floordiv, imod, isub)))

def get_bin(prompt='Bin value'):
    " input binary value with prompt (': ' added for you) "
    while True:
        try:
            return int(input('%s: ' % prompt),2)
        except ValueError:
            print('Please  enter string of 0 or 1 digits')

def get_op(prompt='Give operator'):
    """ input binary operator, which is in global oper dictionary
        (': ' added for you as is the list of valid operators)

    """
    while True:
        op = input('%s (%s): ' % (prompt, ''.join(oper.keys()))).strip()
        if op in oper:
            return op
        else:
            print('You must give one of the operators!')

if __name__ == '__main__':
    first = get_bin('Give first binary number')
    second = get_bin('Give second binary number')
    op = get_op()

    result = oper[op](first,second)
    
    fl = max(len(bin(b)) for b in (first, second, result))
    # get space for operator sign in second line
    sl = fl - 2
    sep = '-' * fl
    print('''
    {first:>{fl}b}
    {op} {second:>{sl}b}
    {sep}
    {result:>{fl}b}
    '''.format(**locals()))

Edited 5 Years Ago by pyTony: n/a