超过 64 位时截断整数
Truncate integers when more than 64 bits
我正在尝试执行一些 64 bit
添加,即:
a = 0x15151515
b = 0xFFFFFFFF
c = a + b
print hex(c)
我的问题是以上输出:
0x115151514
我希望加法为 64 bit
并忽略溢出,即预期输出为:
0x15151514
注意:我不想截断字符串输出,我想要 c = 0x15151514
。我正在尝试模拟一些 64 位寄存器操作。
然后只需使用逻辑与运算符 &
c = 0xFFFFFFFF & (a+b)
顺便说一下,这些是 32 位值,而不是 64 位值(计算 F
;每两个 F
是一个字节 == 8 位;它是八个 F
,所以四个字节,所以 32 位)。
另一个使用 numpy 的解决方案:
import numpy as np
a = np.array([0x15151515], dtype=np.uint32) # use np.uint64 for 64 bits operations
b = np.array([0xFFFFFFFF], dtype=np.uint32)
c = a + b
print(c, c.dtype)
[353703188] uint32
优点:如果有很多操作,特别是如果使用除法等其他操作,则比二进制掩码更具可读性,在这种情况下,您不能只在最终结果上应用掩码,还需要在中间操作中应用它,例如:( 0xFFFFFFFF + 1) // 2)
缺点:增加了一个依赖,需要小心文字:
c = a + 2**32 # 2**32 does not fit in np.uint32 so numpy changes the type of c
print(c, c.dtype)
[4648670485] uint64
我正在尝试执行一些 64 bit
添加,即:
a = 0x15151515
b = 0xFFFFFFFF
c = a + b
print hex(c)
我的问题是以上输出:
0x115151514
我希望加法为 64 bit
并忽略溢出,即预期输出为:
0x15151514
注意:我不想截断字符串输出,我想要 c = 0x15151514
。我正在尝试模拟一些 64 位寄存器操作。
然后只需使用逻辑与运算符 &
c = 0xFFFFFFFF & (a+b)
顺便说一下,这些是 32 位值,而不是 64 位值(计算 F
;每两个 F
是一个字节 == 8 位;它是八个 F
,所以四个字节,所以 32 位)。
另一个使用 numpy 的解决方案:
import numpy as np
a = np.array([0x15151515], dtype=np.uint32) # use np.uint64 for 64 bits operations
b = np.array([0xFFFFFFFF], dtype=np.uint32)
c = a + b
print(c, c.dtype)
[353703188] uint32
优点:如果有很多操作,特别是如果使用除法等其他操作,则比二进制掩码更具可读性,在这种情况下,您不能只在最终结果上应用掩码,还需要在中间操作中应用它,例如:( 0xFFFFFFFF + 1) // 2)
缺点:增加了一个依赖,需要小心文字:
c = a + 2**32 # 2**32 does not fit in np.uint32 so numpy changes the type of c
print(c, c.dtype)
[4648670485] uint64