[issue13535] Improved two's complement arithmetic support: to_signed() and to_unsigned()

Nick Coghlan report at bugs.python.org
Tue Dec 6 01:49:34 CET 2011


New submission from Nick Coghlan <ncoghlan at gmail.com>:

This RFE proposes two new methods "to_signed" and "to_unsigned" on 'int' objects and on the numbers.Integral ABC.

Semantics (and number.Integral implementation):

def to_unsigned(self, bits):
  "Convert this integer to its unsigned two's complement equivalent for the given bit length"
  if self.bit_length() >= bits:
       raise ValueError("{} is too large for {}-bit two's complement
precision".format(self, bits))
  if self >= 0:
       return self
  return 2**bits + self # self is known to be negative at this point

def to_signed(self, bits):
  "Convert an integer in two's complement format to its signed equivalent for the given bit length"
  if self < 0:
       raise ValueError("{} is already signed".format(self))
  if self.bit_length() > bits:
       raise ValueError("{} is too large for {}-bit two's complement
precision".format(self, bits))
  upper_bound = 2**bits
  if self < (upper_bound / 2):
     return self
  return upper_bound - self

To add these methods to numbers.Integral, a concrete numbers.Integral.bit_length() operation will also be needed. This can be implemented simply as:

def bit_length(self):
    return int(self).bit_length()

(Initial concept from this python-ideas thread: http://mail.python.org/pipermail/python-ideas/2011-December/012989.html)

----------
components: Interpreter Core, Library (Lib)
messages: 148896
nosy: ncoghlan
priority: normal
severity: normal
stage: needs patch
status: open
title: Improved two's complement arithmetic support: to_signed() and to_unsigned()
type: feature request
versions: Python 3.3

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue13535>
_______________________________________


More information about the Python-bugs-list mailing list