|  | "Collection of tools for displaying bit representation of numbers.""" | 
|  |  | 
|  | import StringIO | 
|  |  | 
|  |  | 
|  | def binary(n, width=None): | 
|  | """ | 
|  | Return a list of (0|1)'s for the binary representation of n where n >= 0. | 
|  | If you specify a width, it must be > 0, otherwise it is ignored.  The list | 
|  | could be padded with 0 bits if width is specified. | 
|  | """ | 
|  | l = [] | 
|  | if width and width <= 0: | 
|  | width = None | 
|  | while n > 0: | 
|  | l.append(1 if n & 1 else 0) | 
|  | n = n >> 1 | 
|  |  | 
|  | if width: | 
|  | for i in range(width - len(l)): | 
|  | l.append(0) | 
|  |  | 
|  | l.reverse() | 
|  | return l | 
|  |  | 
|  |  | 
|  | def twos_complement(n, width): | 
|  | """ | 
|  | Return a list of (0|1)'s for the binary representation of a width-bit two's | 
|  | complement numeral system of an integer n which may be negative. | 
|  | """ | 
|  | val = 2**(width - 1) | 
|  | if n >= 0: | 
|  | if n > (val - 1): | 
|  | return None | 
|  | # It is safe to represent n with width-bits. | 
|  | return binary(n, width) | 
|  |  | 
|  | if n < 0: | 
|  | if abs(n) > val: | 
|  | return None | 
|  | # It is safe to represent n (a negative int) with width-bits. | 
|  | return binary(val * 2 - abs(n)) | 
|  |  | 
|  | # print binary(0xABCD) | 
|  | # [1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1] | 
|  | # print binary(0x1F, 8) | 
|  | # [0, 0, 0, 1, 1, 1, 1, 1] | 
|  | # print twos_complement(-5, 4) | 
|  | # [1, 0, 1, 1] | 
|  | # print twos_complement(7, 4) | 
|  | # [0, 1, 1, 1] | 
|  | # print binary(7) | 
|  | # [1, 1, 1] | 
|  | # print twos_complement(-5, 64) | 
|  | # [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1] | 
|  |  | 
|  |  | 
|  | def positions(width): | 
|  | """Helper function returning a list describing the bit positions. | 
|  | Bit positions greater than 99 are truncated to 2 digits, for example, | 
|  | 100 -> 00 and 127 -> 27.""" | 
|  | return ['{0:2}'.format(i)[-2:] for i in reversed(range(width))] | 
|  |  | 
|  |  | 
|  | def utob(debugger, command_line, result, dict): | 
|  | """Convert the unsigned integer to print its binary representation. | 
|  | args[0] (mandatory) is the unsigned integer to be converted | 
|  | args[1] (optional) is the bit width of the binary representation | 
|  | args[2] (optional) if specified, turns on verbose printing""" | 
|  | args = command_line.split() | 
|  | try: | 
|  | n = int(args[0], 0) | 
|  | width = None | 
|  | if len(args) > 1: | 
|  | width = int(args[1], 0) | 
|  | if width < 0: | 
|  | width = 0 | 
|  | except: | 
|  | print utob.__doc__ | 
|  | return | 
|  |  | 
|  | if len(args) > 2: | 
|  | verbose = True | 
|  | else: | 
|  | verbose = False | 
|  |  | 
|  | bits = binary(n, width) | 
|  | if not bits: | 
|  | print "insufficient width value: %d" % width | 
|  | return | 
|  | if verbose and width > 0: | 
|  | pos = positions(width) | 
|  | print ' ' + ' '.join(pos) | 
|  | print ' %s' % str(bits) | 
|  |  | 
|  |  | 
|  | def itob(debugger, command_line, result, dict): | 
|  | """Convert the integer to print its two's complement representation. | 
|  | args[0] (mandatory) is the integer to be converted | 
|  | args[1] (mandatory) is the bit width of the two's complement representation | 
|  | args[2] (optional) if specified, turns on verbose printing""" | 
|  | args = command_line.split() | 
|  | try: | 
|  | n = int(args[0], 0) | 
|  | width = int(args[1], 0) | 
|  | if width < 0: | 
|  | width = 0 | 
|  | except: | 
|  | print itob.__doc__ | 
|  | return | 
|  |  | 
|  | if len(args) > 2: | 
|  | verbose = True | 
|  | else: | 
|  | verbose = False | 
|  |  | 
|  | bits = twos_complement(n, width) | 
|  | if not bits: | 
|  | print "insufficient width value: %d" % width | 
|  | return | 
|  | if verbose and width > 0: | 
|  | pos = positions(width) | 
|  | print ' ' + ' '.join(pos) | 
|  | print ' %s' % str(bits) |