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
答案 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)])