取整数最右边的 n 位

问题描述

我知道如何获得整数最左边的 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 并消除前导一。