Python 多个位集的返回状态

Python 多个位集的返回状态,python,bit-manipulation,Python,Bit Manipulation,我正在根据传递的变量值检查当前单个位的状态。 我试过了 def check_status(bit0 = False,bit2 = False,bit3=False): regvalue = read_register() if bit0: if regvalue & 0x01: return 1 else: return 0 elif bit2: if regvalue

我正在根据传递的变量值检查当前单个位的状态。 我试过了

def check_status(bit0 = False,bit2 = False,bit3=False):
    regvalue = read_register()
    if bit0:
        if regvalue & 0x01:
            return 1
        else:
            return 0
    elif bit2:
        if regvalue & 0x04:
            return 1
        else:
            return 0
    elif bit3:      
        if regvalue & 0x08:
            return 1
        else:
            return 0
    else:
        raise
如何以有效的方式返回多个位的状态?
例如,如果要通过将比特0和比特3作为true传递来检查它们的状态,那么作为回报,如果两者都设置或它们的当前值,我应该得到1

var =  0b10100
mask = 0b10001
if not var^mask:
    print "all bits match"
else:
    print "match bits  (0 if bits match, 1 otherwise)", "{0:b}".format(var ^ mask)

您可以用bit0/2/3变量创建一个位掩码,并对照该掩码检查寄存器

def check_status(bit0 = False,bit2 = False,bit3=False):
    regvalue = read_register()
    mask = (0, 0x1)[bit0]
    mask = mask | (0, 0x4)[bit2]
    mask = mask | (0, 0x8)[bit3]
    return regvalue & mask != 0 
如果至少设置了一个请求位,则返回true。 如果仅当设置了所有请求的位时才希望返回True,请执行以下操作
返回regvalue&mask==mask

这构造了一个掩码,其中,如果位0、位2和位3为真,则掩码=0xd;例如,如果位0为真,且位2/位3为假,则掩码为0x1


(如果您想知道
(0,0x4)[bit2]
语法)

模块
位数组
非常适合从各种输入构建位数组。下面是一个简单的例子:

from bitarray import bitarray
a1 = bitarray('101')
a2 = bitarray(True, False, True)
a3 = bitarray('100')

# Connecting arrays with & gives you an array in which all the bytes which are 1 in both arrays are 1 as well
a1 & a2  # bitarray('101')
a1 & a3  # bitarray('100')

# comparing this result with your original mask, will give you a True or False
a1 & a2 == a1  # True
a1 & a3 == a2  # False
有关更多信息,请参阅

关于函数,假设
read\u register()
bitarray()
返回一个有效的可转换值,我会这样做:

import bitarray from bitarray
def check_status(bit0 = False,bit2 = False,bit3=False):
    regvalue = bitarray(read_register())
    mask = bitarray([bit1, bit2, bit3])  # or even use the args parameter here
    return regvalue & mask == mask
可能的副本:可能的副本