返回多个位组的状态

时间:2017-02-02 09:42:23

标签: 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 & 0x04:
            return 1
        else:
            return 0
    elif bit3:      
        if regvalue & 0x08:
            return 1
        else:
            return 0
    else:
        raise

如何以有效的方式返回多于一位的状态? 就像想要通过将它们传递为true来检查bit0和bit3的状态一样,作为回报,如果两者都设置或它们的当前值,我应该得到1

3 个答案:

答案 0 :(得分:0)

我不确定这是你正在寻找的,但我会建议以下

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)

答案 1 :(得分:0)

您可以在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,请执行 return regvalue & mask == mask

如果bit0,bit2和bit3为True,则构造掩码,其中mask = 0xd,例如,如果bit0为True且bit2 / bit3为False,则掩码为0x1。

(如果您想了解(0,0x4)[bit2]语法)

,请参阅here

答案 2 :(得分:0)

模块bitarray非常适合从各种输入构造比特阵列。这是一个小小的一般例子:

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

有关详细信息,请参阅here

关于read_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