125 lines · python
1"Collection of tools for displaying bit representation of numbers." ""2 3 4def binary(n, width=None):5 """6 Return a list of (0|1)'s for the binary representation of n where n >= 0.7 If you specify a width, it must be > 0, otherwise it is ignored. The list8 could be padded with 0 bits if width is specified.9 """10 l = []11 if width and width <= 0:12 width = None13 while n > 0:14 l.append(1 if n & 1 else 0)15 n = n >> 116 17 if width:18 for i in range(width - len(l)):19 l.append(0)20 21 l.reverse()22 return l23 24 25def twos_complement(n, width):26 """27 Return a list of (0|1)'s for the binary representation of a width-bit two's28 complement numeral system of an integer n which may be negative.29 """30 val = 2 ** (width - 1)31 if n >= 0:32 if n > (val - 1):33 return None34 # It is safe to represent n with width-bits.35 return binary(n, width)36 37 if n < 0:38 if abs(n) > val:39 return None40 # It is safe to represent n (a negative int) with width-bits.41 return binary(val * 2 - abs(n))42 43 44# print binary(0xABCD)45# [1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1]46# print binary(0x1F, 8)47# [0, 0, 0, 1, 1, 1, 1, 1]48# print twos_complement(-5, 4)49# [1, 0, 1, 1]50# print twos_complement(7, 4)51# [0, 1, 1, 1]52# print binary(7)53# [1, 1, 1]54# print twos_complement(-5, 64)55# [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]56 57 58def positions(width):59 """Helper function returning a list describing the bit positions.60 Bit positions greater than 99 are truncated to 2 digits, for example,61 100 -> 00 and 127 -> 27."""62 return ["{0:2}".format(i)[-2:] for i in reversed(range(width))]63 64 65def utob(debugger, command_line, result, dict):66 """Convert the unsigned integer to print its binary representation.67 args[0] (mandatory) is the unsigned integer to be converted68 args[1] (optional) is the bit width of the binary representation69 args[2] (optional) if specified, turns on verbose printing"""70 args = command_line.split()71 try:72 n = int(args[0], 0)73 width = None74 if len(args) > 1:75 width = int(args[1], 0)76 if width < 0:77 width = 078 except:79 print(utob.__doc__)80 return81 82 if len(args) > 2:83 verbose = True84 else:85 verbose = False86 87 bits = binary(n, width)88 if not bits:89 print("insufficient width value: %d" % width)90 return91 if verbose and width > 0:92 pos = positions(width)93 print(" " + " ".join(pos))94 print(" %s" % str(bits))95 96 97def itob(debugger, command_line, result, dict):98 """Convert the integer to print its two's complement representation.99 args[0] (mandatory) is the integer to be converted100 args[1] (mandatory) is the bit width of the two's complement representation101 args[2] (optional) if specified, turns on verbose printing"""102 args = command_line.split()103 try:104 n = int(args[0], 0)105 width = int(args[1], 0)106 if width < 0:107 width = 0108 except:109 print(itob.__doc__)110 return111 112 if len(args) > 2:113 verbose = True114 else:115 verbose = False116 117 bits = twos_complement(n, width)118 if not bits:119 print("insufficient width value: %d" % width)120 return121 if verbose and width > 0:122 pos = positions(width)123 print(" " + " ".join(pos))124 print(" %s" % str(bits))125