使用十六进制值操作不适用于十六进制功能

时间:2015-02-09 08:51:26

标签: python

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 个答案:

答案 0 :(得分:2)

您收到此错误,因为hex函数返回字符串。十六进制,二进制,十进制只是整数值的表示。 12289和0x3001是相同的,所以你可以这样做:

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

    # Or convert string to int if you need 
    sendValue(int(hex(12289), 16))

答案 1 :(得分: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)])