我正在检查当前基于我传递的变量值的单个位的状态。 我试过了
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
答案 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]
语法)
答案 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