2017-02-02 39 views
2

我正在根據變量值I pass來檢查當前單個位的狀態。 我試圖多位集的返回狀態

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

+1

可能dublicate的:http://stackoverflow.com/questions/11669178/how-在Python中創建一個位數組 –

+0

[如何在Python中創建一個位數組?](http://stackoverflow.com/questions/11669178/how-to-create-一個陣列-的位功能於蟒) – ilim

回答

0

你可以從你的位0/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

這構建了一個面罩,其中面罩= 0xd中,如果第0位,第2位和第3位是真實的,例如如果bit0爲True且bit2/bit3爲False,則掩碼爲0x1。

(見here,如果你想知道的(0,0x4)[bit2]語法)

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) 
0

模塊bitarray真的很好,從各種輸入構建bitarrays。這裏是一個小將軍例如:

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