2015-02-09 2 views
1

1) У меня есть небольшая проблема при работе с шестнадцатеричными значениями. Почему sendValue(hex(12289)) приводит к ошибке (прерывание скрипта), а sendValue(0x3001) работает?Работа с шестнадцатеричными значениями не работает с шестнадцатеричной функцией

def sendValue(value): 
    for i in range(16): 
     if (value & 0x8000): 
      print "1" # later this bit will be sent to a LC 
     else: 
      print "0" # later this bit will be sent to a LC 
     value <<= 1 # corrected this 

def main(): 
    sendValue(0x3001) 
    sendValue(hex(12289)) 

if __name__ == '__main__': 
    main() 

2) Я ожидал, что выходной сигнал

0 
0 
1 
1 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
1 

Но я просто получить 0

+2

** Что ** ошибка? –

+2

Это потому, что 'hex (12289)' возвращает 'string', и вы сравниваете его с' number' в 'if'. Поэтому он выдает ошибку. –

+2

Вы не используете 'i' нигде в цикле. Вы делаете 'значение & 0x8000' 16 раз. –

ответ

2

Ваша sendValue() функция просто печатает значащий бит числа в 16 раз. Вам нужно просканировать каждый бит. Например,

#!/usr/bin/env python 

def sendValue(value): 
    print hex(value), 

    for i in range(16): 
     if (value & 0x8000): 
      print "1", 
     else: 
      print "0", 

     #Right-shift value to put next bit into the MSB position 
     value <<= 1 

    print 


def main(): 
    sendValue(0x3001) 
    sendValue(12289) 
    sendValue(0x123f) 


if __name__ == '__main__': 
    main() 

**output** 

0x3001 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 
0x3001 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 
0x123f 0 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 

Обратите внимание, что Python имеет встроенный bin() функции для преобразования целых чисел в битовые строки:

>>> bin(0x3001) 
'0b11000000000001' 
>>> bin(0xfed) 
'0b111111101101' 

Но если вы не хотите использовать bin() по какой-то причине, есть и другие способы сделать это более компактным, чем мой предыдущий код. Например, переход value влево и маскируя его с & 1, как это:

def sendValue(value): 
    print hex(value), 
    print ' '.join([str(value >> i & 1) for i in range(16, -1, -1)]) 
2

Вы получили эту ошибку, потому что функция hex возвращает строку. Шестнадцатеричные, двоичные, десятичные - это только представления целочисленного значения. 12289 и 0x3001 это то же самое, так что вы можете просто сделать:

def main(): 
    sendValue(0x3001) 
    sendValue(12289) 

    # Or convert string to int if you need 
    sendValue(int(hex(12289), 16)) 
Смежные вопросы