Eryk Sun added the comment:

bin() returns a Python literal, which thankfully requires an explicit sign. 2's 
complement literals would be prone to human error. If you want 2's complement, 
you can write your own function. For example:

    def mybin(number, nbits=None, *, signed=True):
        if not signed and number < 0:
            raise ValueError('number must be non-negative')
        if nbits is None:
            return bin(number)
        bit_length = number.bit_length()
        if signed and number != -2 ** (bit_length - 1):
            bit_length += 1
        if nbits < bit_length:
            raise ValueError('%d requres %d bits' % (number, bit_length))
        number &= 2 ** nbits - 1
        return format(number, '#0%db' % (nbits + 2))

    >>> mybin(12)
    '0b1100'
    >>> mybin(-12)
    '-0b1100'
    >>> mybin(12, 8)
    '0b00001100'
    >>> mybin(-12, 8)
    '0b11110100'

    >>> mybin(12, 4)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 10, in mybin
    ValueError: 12 requres 5 bits

Obviously when parsing a number you need to know whether it's two's complement 
or unsigned.

    >>> mybin(12, 4, signed=False)
    '0b1100'
    >>> mybin(-4, 4)
    '0b1100'

----------
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue25999>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to