组合位标志
Combine Bitflags
我有几个标志:
None = 0
HR = 1
HD = 2,
DT = 4,
Fl = 8
..
等等
我想创建一个函数,在其中输入某个标志,比方说:6。
返回的应该是HDDT,因为2 | 4 = 6。
也可能发生 3 个或更多标志组合在一起或只有一个标志的情况。
例如: 7 = 1 | 2 | 4 => HRHDDT。
如何根据标志值 return 连接字符串?
在我的例子中,枚举有更多的条目,这会使一个简单的 if 语句变得非常不舒服,因为我必须涵盖数百个案例。
有什么巧妙的解决方法吗?
假设我们在某处有一个列表,其中包含 2 的幂:
flags = ['HR','HD','DT','Fl']
那么你可以编写如下函数:
def power2():
i = 1
while True:
yield i
i *= 2
def obtain_flag(val):
if val:
return ''.join([f for f,i in zip(flags,power2()) if i&val])
else:
return None
return None
不是必需的:它是映射到零的标志。
或者如果你想要一个标志列表(在这种情况下,标志可以是任何东西):
def obtain_flag(val):
if val:
return [f for f,i in zip(flags,power2()) if i&val]
这给出:
>>> obtain_flag(6)
'HDDT'
>>> obtain_flag(7)
'HRHDDT'
>>> obtain_flag(0) # returns None, but None is not printed
>>> obtain_flag(1)
'HR'
>>> obtain_flag(2)
'HD'
>>> obtain_flag(3)
'HRHD'
>>> obtain_flag(4)
'DT'
您可以像这样将标志存储为 dict
:
flags = {1:'HR', 2:'HD', 4:'DT', 8:'FL'}
并按位 and
您的号码和用于检索字符串的标志:
def get_flags(num):
if num:
return ''.join(flags[x] for x in flags if x & num)
return None
>>> get_flags(6)
'HDDT'
我有几个标志:
None = 0
HR = 1
HD = 2,
DT = 4,
Fl = 8
..
等等
我想创建一个函数,在其中输入某个标志,比方说:6。
返回的应该是HDDT,因为2 | 4 = 6。 也可能发生 3 个或更多标志组合在一起或只有一个标志的情况。 例如: 7 = 1 | 2 | 4 => HRHDDT。
如何根据标志值 return 连接字符串?
在我的例子中,枚举有更多的条目,这会使一个简单的 if 语句变得非常不舒服,因为我必须涵盖数百个案例。
有什么巧妙的解决方法吗?
假设我们在某处有一个列表,其中包含 2 的幂:
flags = ['HR','HD','DT','Fl']
那么你可以编写如下函数:
def power2():
i = 1
while True:
yield i
i *= 2
def obtain_flag(val):
if val:
return ''.join([f for f,i in zip(flags,power2()) if i&val])
else:
return None
return None
不是必需的:它是映射到零的标志。
或者如果你想要一个标志列表(在这种情况下,标志可以是任何东西):
def obtain_flag(val):
if val:
return [f for f,i in zip(flags,power2()) if i&val]
这给出:
>>> obtain_flag(6)
'HDDT'
>>> obtain_flag(7)
'HRHDDT'
>>> obtain_flag(0) # returns None, but None is not printed
>>> obtain_flag(1)
'HR'
>>> obtain_flag(2)
'HD'
>>> obtain_flag(3)
'HRHD'
>>> obtain_flag(4)
'DT'
您可以像这样将标志存储为 dict
:
flags = {1:'HR', 2:'HD', 4:'DT', 8:'FL'}
并按位 and
您的号码和用于检索字符串的标志:
def get_flags(num):
if num:
return ''.join(flags[x] for x in flags if x & num)
return None
>>> get_flags(6)
'HDDT'