2016-04-16 3 views
0

Я вытягиваю байтовые данные из процессора и пытаюсь извлечь один бит/флаг для статуса. Я вытаскиваю байт данных из 0x1B, а затем маскирую против 0x08, который должен оставить 4-й бит. В нормальном режиме работы требуется некоторое время для немного флипа - поэтому я итерация на потянув немного и не испытывать егоПобитовые переменные AND и String

STATUS_FOC = [] 
STATUS = [] 
FOC_Mask = [] 
while x <= 100: 
    STATUS = bin(sys.Read(0x1B)) 
    print 'status', STATUS 
    FOC_Mask = bin(0x08) 
    print 'FOC', FOC_Mask 

    STATUS_FOC = STATUS & FOC_Mask 

Независимо от того, что я делаю для переменных Python настаивает на последней строке, что я пытаюсь сделать логическое И двух строк. Выход STATUS и FOC_Mask следующим образом:

статус 0b11010000 ВОК 0b1000

, которую я прочитал в бинарном виде, и все же программа падает за линию, говоря, что он не может сделать «&» операцию по строки. Справка

+1

Ну, да. 'bin()' возвращает строку. Прекратите использовать его. –

ответ

2

Функция bin() возвращает строку. Вы не нуждаетесь в этом в своем коде. Просто выполните:

STATUS_FOC = [] 
STATUS = [] 
FOC_Mask = [] 
# x = 0 
while x <= 100: 
    STATUS = sys.Read(0x1B) 
    print 'status', STATUS 
    FOC_Mask = 0x08 
    print 'FOC', FOC_Mask 
    STATUS_FOC = STATUS & FOC_Mask 
    # x += 1 

Это должно сработать, у меня нет возможности проверить его с помощью вашей системы. Я также добавил подсказку для увеличения x, иначе Python даст вам ошибку при условии while, или ваш цикл будет длиться вечно, если x определен в другом месте, если это не то, что вы хотели.

0

bin дает вам представление о наличии двоичного числа. Для того, чтобы использовать оператор побитового &, оба значения сильно быть ints

In [10]: status = bin(0x1B) 

In [11]: print 'status', status 
status 0b11011 

In [12]: mask = bin(0x08) 

In [13]: print 'foc ', mask 
foc 0b1000 

In [14]: status_foc = int(status, 2) & int(mask, 2) 

In [15]: print 'status_foc', status_foc 
status_foc 8 

In [16]: status_foc = bin(status_foc) 

In [17]: print 'status_foc', status_foc 
status_foc 0b1000 

Второй аргумент в int('string', 2) делает его основание 2, или двоичный файл.

Смежные вопросы