我正在尝试在Python中复制/验证按位算术逻辑。 我遇到过绝对值中的位被截断(无论它们是 0 还是 1)而符号被保留的情况。这种情况发生在各种位长度表示中。 如何在 Python 中优雅地实现负整数的绝对值截断位?
对于正整数,我可以轻松应用位掩码:
n=7; nMod=n & 0b11; print(nMod) #truncate MSB
#expected and actual: 3
对于负整数它不起作用,可能是由于内部 2 的补码和可变的位数表示:
n=-7; nMod=n & 0b11; print(nMod)
#expected:-3; actual: 1
人们当然可以分析绝对值,确定哪些位实际上是“1”,并通过左右移动来删除它们,但我的愿望是像正数一样简单的单行。
假设
n
是值,mask
是掩码。您基本上需要做sign(n)*(abs(n)&mask)
。要执行sign(n)
,您可以这样做(n>0)-(n<0)
。
所以这是一行,
def signed_masking(n, mask):
return ((n>0)-(n<0))*(abs(n)&mask)