我有一系列由位字段表示的 25 个标志和一个表示此时设置的任何标志的会话整数。我想屏蔽整数,例如268698112 并查看设置了哪些标志。
class Flags:
flaga = 0x0001
flagi = 0x0100
flagp = 0x8000
flagq = 0x010000
flagv = 0x10000000
我尝试了以下两行,但它们只返回零。
test_a = session & flag_mask
test_b = (session >> flag_mask) & 1
我看过从Python中的int中提取位域,虽然我可以看到位字符串可能会有所帮助,但我不知道如何将整数添加到混合中而不出现错误。例如我尝试过:
bitstring.Bits(session) & bitstring.BitArray(flag_mask)
(bitstring.Bits(session) >> bitstring.BitArray(flag_mask)) & 1
但是得到:
Bitstrings must have the same length for and operator
< not supported between instances of "BitArray" and "int"
如何从给定标志的会话 int 中提取 true 或 false 值?
我知道你有一个解决方案,但仍然想分享如何使用 IntFlag 来解决这个问题。 我使用了您的示例值
268698112
(0b10000000001000000001000000000
)。
使用您的标志创建一个 IntFlag 类:
from enum import IntFlag, KEEP
class SessionFlag(IntFlag, boundary=KEEP):
flaga = 2**0 # rightmost bit
flagi = 2**8 # 9th from right since zero based
flagp = 2**15
flagq = 2**16
flagv = 2**28
要转换
int
,请将其传递给构造函数。余数
262656
是0b1000000001000000000
,所以有两个未定义的标志。
>>> session = SessionFlag(268698112)
>>> session
<SessionFlag.flagv|262656: 268698112>
获取定义的标志列表:
>>> list(session)
[<SessionFlag.flagv: 268435456>]
检查标志:
>>> SessionFlag.flagq in session
False
>>> SessionFlag.flagv in session
True
>>> SessionFlag(2**9) in session # convert undefined flag for checking
True
>>> SessionFlag(2**13) in session # convert undefined flag for checking
False