问题描述
我知道如何获得整数最左边的 n 位(比如 8 位):
>>> num = 59840
>>> bin(num)
0b1110100111000000
>>> first_8 = num >> 8
>>> bin(first_8)
0b11101001
但我不明白如何获得最右边的 n。
>>> last_8 = num << 8
>>> bin(last_8)
# result
0b111010011100000000000000
# desired
0b11000000
解决方法
TL;DR
按位和带 0b11111111
的数字(又名0xFF
谢谢,Chris)。
>>> bin(num & 0b11111111)
'0b11000000'
详细信息:您的位移尝试在 Python 中不起作用,因为整数具有任意精度。因此,当您左移 8 位时,您只需将原始数字乘以 28 或 256。在其他使用固定精度整数的语言中,溢出的最高有效位将被丢弃,因此你可以做 (num << 8) >> 8
来得到你想要的结果。 C++ example
另请注意:右移方法适用于接下来的 8 位,因为 59840 是一个 16 位整数。如果你对大于 65535 的东西尝试同样的事情,它就行不通。例如:
>>> bin(100000 >> 8)
'0b110000110'
(注意这多于八位)。一个更健壮的方法是按位并屏蔽掉您不关心的位,然后然后右移正确的数量。
>>> bin((100000 & 0xFF00) >> 8)
'0b10000110'
,
如果您要获得恒定数量的位,则可以将这些位与常数进行 AND 运算。但是,如果您有可变数量的位,则有一种简单的方法可以生成正确的掩码。
def right_most(value,n):
return value & ((1 << n) - 1)
>>> bin(right_most(0b1110100111000000,8))
'0b11000000'
(1 << n)
项生成一后跟 n
零。 - 1
将这些零转换为 1 并消除前导一。