我有一系列由位域表示的 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 值?
以下是使用位掩码确定哪些标志已设置的方法:
class Flags:
flaga = 0x0001
flagi = 0x0100
flagp = 0x8000
flagq = 0x010000
flagv = 0x10000000
session = 268698112
# 检查每个标志是否已设置
if (session & Flags.flaga) != 0:
print("flaga 已设置")
if (session & Flags.flagi) != 0:
print("flagi 已设置")
if (session & Flags.flagp) != 0:
print("flagp 已设置")
if (session & Flags.flagq) != 0:
print("flagq 已设置")
if (session & Flags.flagv) != 0:
print("flagv 已设置")
说明:
-
按位与运算符(&): 我们使用按位与运算符(&)将会话整数与每个标志进行掩码。如果结果非零,则表示该标志在会话整数中已设置。
-
检查非零结果: 我们将
&
运算的结果与零进行比较。如果结果不等于零,则表示该标志已设置。
的代码中出现错误的原因:
-
尝试使用
flag_mask
,但它在代码中未定义。需要针对每个标志使用特定的标志值(例如,Flags.flaga
、Flags.flagi
等)。 -
尝试对位字符串使用按位运算符,但这会导致错误,因为这些运算符不适用于位字符串和整数之间的操作。
此代码将正确标识会话整数中设置的标志。
标签:python,bit-fields From: 77529042