python整数表示和算术库
pirep的Python项目详细描述
python整数表示和算术库
此工具可能对系统软件开发人员(例如,编译器或binutils开发人员)有用。下面是以方便的形式表示整数的函数,以及对任意格式整数进行算术运算的函数。
安装
$ git clone https://github.com/smurphik/pirep
$ cd pirep
$ sudo python3 setup.py install clean
其他方式:
$ sudo pip3 install pirep
格式
几乎所有函数的整数参数都可以是4种格式中的任意一种:
- decimal-常用的python整数(
0
,7
,-2
,…); - 十六进制-带或不带前缀
'0x'
('0xf'
,'a7'
,甚至'-0xcf'
)或通常的十六进制int(0x3
,0xd
,…,但python将其转换为通常的十进制int); - binary-前缀为
'0b'
('0b010110'
,'0b0'
,…)或通常的0b...
整数的字符串; - float-常用的python float(为什么不呢?
0.0
,17.
,-3.
,…)。
可以通过调用psetmode()
全局指定算术函数的默认输出格式,也可以通过每个接口的参数fmt
本地指定算术函数的默认输出格式。十六进制/二进制输出格式是前缀为'0x'
/'0b'
的字符串。
表示
c2repr
根据当前的有符号性和int宽度(默认为64位有符号),以任何输出格式给出two的补码表示。
>>> from pirep import *
>>> c2repr(5, 'b')
'0b101'
>>> c2repr(-10)
'0xfffffffffffffff6'
>>> c2repr('8000000000000000', 'd')
-9223372036854775808
>>> c2repr('4000000000000000', 'd')
4611686018427387904
举例说明decomp
的含义。操作sethi %hi(0x103c00), %o3
(请参阅sparc指令集)编码为1700040f
。我们可以在它的字段上清楚地扩展代码指令。为此,我们需要知道所有字段的最后位数:
>>> decomp('1700040f', (31, 29, 24, 21))
['00', '01011', '100', '0000000000010000001111']
>>> decomp('1700040f', (31, 29, 24, 21), 'h')
['0x0', '0xb', '0x4', '0x40f']
为什么'0x40f'
而不是0x103c00
?没关系。sethi
只设置22个高位:
# Left shift
>>> psll('0x40f', 10)
'0x103c00'
我们可以按字节分解任何整数:
>>> decomp(3932166)
['00111100', '00000000', '00000110']
更详细的解码方法-对类的对象使用Enc
:
>>> e = Enc('sethi', (('opc', 31), ('rd', 29), ('opc', 24), ('imm22', 21)))
>>> decode('1700040f', e, borders=True)
opc rd opc imm22
00 01011 100 0000000000010000001111
31-30 29-25 24-22 21-------------------0
>>> e.field(('opc', 31)).add_only_true(0)
>>> e.field(('rd', 29)).add_verbose(11, 'eleven')
>>> decode('1700040f', e, 'h')
opc rd opc imm22
0x0 0xb 0x4 0x40f
rd[29:25]: eleven
有一个单独的模块可以方便地包含您经常使用的所有编码。
算术
您可以通过psetmode()
:
>>> from pirep import *
# Default mode: signed, 64-bit, hexadecimal default output
>>> pgetmode()
[True, 64, 'h']
>>> psub('0x100', 15)
'0xf1'
# Signed 8-bit int with decimal output by default
>>> psetmode(True, 8, 'd')
>>> psub('0x100', 15.)
-15
>>> psub('0x100', '0b1111', 'b')
'0b11110001'
pirep包含其他几个基本算术函数:
>>> psetmode(True, 8, 'd')
>>> pmul(3, padd(pdiv('f', '0b100'), prem(11, '0x3')))
15
>>> psetbits(15, (3, 5), '0b110')
55
>>> padd(pintmin(), pintmax())
-1