Do you want to find -10 in negaternary?

Updated TrustyTony 0 Tallied Votes 242 Views Share

Here is base conversion function written to deal also with negative bases.
Not yet balanced ternary, where numbers themselves can be negative, maybe later I add it.. Based on the code in the wikipedia article, which has bug for converting 0.[Edit: I fixed the bug in wikipedia]

""" Program to show number in different bases including the negative bases
    val function for calculating the value of string as number (like extended int) added
"""

def reversed_negadigits(n, base=-3):
    """ produce digits of number at base base, also for negative base,
        in reverse order """
    if n < 0 and base > 0:
        negative = '-'
        n = -n
    else:
        negative = ''

    # case zero    
    if not n:
        yield '0'
    else:    
        while n != 0:
            n, remainder = divmod(n, base)
            if remainder < 0:
                n, remainder = n + 1, remainder - base
            yield str(remainder) if remainder < 10 else chr(ord('A')+remainder-10)
    if negative: yield negative

def negabase(n, base=-3):
    return ''.join(reversed(list(reversed_negadigits(n, base))))

def val(number_string, base=-3):
    return sum(int(n) * base ** p for p, n in enumerate(reversed(number_string)))
    
print('%10s %10s %10s %10s %10s %10s' % ('dec', 'hex', 'bin', 'negabin', 'ternary', 'negaternary'))
for t in range(-32,+33):
    print('%10s %10s %10s %10s %10s %10s' % (t, negabase(t, 16), negabase(t, 2), negabase(t, -2), negabase(t, 3), negabase(t, -3)))
    assert val(negabase(t)) == t
TrustyTony 888 ex-Moderator Team Colleague Featured Poster

Few first functions to show the values and negate before tackling the generating part for balanced ternary

def balanced_ternary(number_string):
    return val([-1 if c == '-' else (1 if c == '+' else 0) 
                for c in number_string], 3)

def neg(balanced):
    return balanced.replace('-', '*').replace('+', '-').replace('*', '+')

if __name__  == '__main__':
    b = '-0+'
    print('\nBalanced ternary %r value is %i' % (b, balanced_ternary(b)))
    assert balanced_ternary(b) == -balanced_ternary(neg(b))
TrustyTony 888 ex-Moderator Team Colleague Featured Poster
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.