def decimalToBase(num, base): negative = num < 0 if negative: num *= -1 if base == "BCD": result = "" while num != 0: digit = int(num) % 10 digit_conv = decimalToBase(digit, 2) result = "0"*(4-len(digit_conv)) + digit_conv + result num = (int) (num / 10) elif base == "2CP": part_result = decimalToBase(num, 2) if negative: result = "1" one = False for i in range(1, len(part_result)): if not(one) and part_result[i] == "1": one = True if one and negative: result += str( 1 - int(part_result[i])) else: result += part_result[i] else: result = "0" + part_result else: base = int(base) num = int(num) lResult = [] while num != 0: lResult.insert(0, num % base) num = int(num / base) #if an index of the list is >= 10 is replaced by an upper letter in ASCII (10-->A, 11-->B). Useful for bases > 10 for i in range(0, len(lResult)): if lResult[i] >= 10: lResult[i] = chr(lResult[i] + 55) result = ''.join(str(e) for e in lResult) if negative and base != "2CP": return "-" + result else: return result def baseToDecimal(num, base): if num == "": return 0 negative = num[0] == '-' if negative: num = num[1:] if base == "BCD": s = "" exp = 0 count = 0 result = 0 for i in range(len(num)-1, -1, -1): count += 1 s += num[i] if count == 4: part_result = baseToDecimal(s[::-1], 2) if part_result > 9: raise ValueError(f'Number > 9 ({s[::-1]} => {part_result}) present in BCD') else: result += part_result * (10**exp) exp += 1 count = 0 s = "" part_result = baseToDecimal(s[::-1], 2) if part_result > 9: raise ValueError(f'Number > 9 ({s[::-1]} => {part_result}) present in BCD') else: result += part_result * (10**exp) else: if base == "2CP": calc_base = 2 if negative: raise ValueError(f"2CP can't have negative sign") else: calc_base = int(base) result = 0 lnum = len(num) for i in range(0, lnum): exp = calc_base**(lnum-1-i) if("0" <= num[i] <= "9"): if int(num[i]) >= calc_base: raise ValueError(f'Digit {num[i]} is >= than base {calc_base}') if base == "2CP" and i == 0: #MSB needs to be subtracted in cp2 result -= int(num[i]) * exp else : result += int(num[i]) * exp else: if (ord(num[i]) - 55) >= calc_base: raise ValueError(f'Digit {num[i]} ({ord(num[i]) - 55}) is >= than base {calc_base}') #allow for bases > 10 where letters are required result += (ord(num[i]) - 55) * exp if negative: return -result else: return result if __name__ == "__main__": number = input("Type in the number: ") base1 = input("Type the starting numerical base: ") base2 = input("Type the numerical base you want to convert it to: ") num1 = int(baseToDecimal(number, base1)) print(num1) num_final = decimalToBase(num1, base2) print(f'{number} ({base1}) = {num_final}({base2})') # try: # print(baseToDecimal("11111111", 2)) # print(baseToDecimal("31", 8)) # print(baseToDecimal("FF", 16)) # print(baseToDecimal("100", "2CP")) # print(baseToDecimal("", 2)) # print(baseToDecimal("0110", "BCD")) # print(baseToDecimal("110110", "BCD")) # print() # print(baseToDecimal("-11111111", 2)) # print(baseToDecimal("-31", 8)) # print(baseToDecimal("-FF", 16)) # print(baseToDecimal("", 2)) # print(baseToDecimal("-0110", "BCD")) # print(baseToDecimal("-110110", "BCD")) # # print(baseToDecimal("-100", "2CP")) # # print(baseToDecimal("110111", "BCD")) # print() # print(decimalToBase(127, "2CP")) # print(decimalToBase(-4, "2CP")) # print(decimalToBase(169, "BCD")) # print(decimalToBase(255, 2)) # print(decimalToBase(128, 2)) # print(decimalToBase(127, 2)) # except ValueError as v: # print(v)