如何用位域掩码 int

问题描述 投票:0回答:1

我有一系列由位字段表示的 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 值?

python bit-fields
1个回答
2
投票

IntFlagFlag

的文档

我知道你有一个解决方案,但仍然想分享如何使用 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
,请将其传递给构造函数。
IntFlag 不会丢弃未定义的标志,但它们全部作为一个 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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.