取一个整数最右边的n位

Take n rightmost bits of an integer

我知道如何获取整数的最左边的 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的数字(a.k.a。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) 项生成一个 1,后跟 n 个零。 - 1 将这些零转换为 1,并消除前导的一个。