较短的方法来解析这个字节
问题描述:
有没有更简单的方法来这个在python中?较短的方法来解析这个字节
if byte is 1:
return 0
if byte is 2:
return 1
if byte is 4:
return 2
if byte is 8:
return 3
if byte is 64:
return 4
if byte is 128:
return 5
进出口使用python2.7
创建字典是可能的,但仍然很长,有没有数学方法? 谢谢。
答
详细
如果你坚持非字典解决方案,您可以使用对数基座2如下一些布尔运算。
首先获得您的输入字节b
对数基地2(在某些语言中表示lg(b)
,但我不知道Pythonian;而log
当心:在大多数语言中,这表示对数基数为10)。
如果在您的语言中没有这种功能,请使用自然对数进行转换,如下所示:n=ln(b)/ln(2)
。对于b
可以得到以下n
:
b n
1 0
2 1
4 2
8 3
64 6
128 7
在这个中间结果n
,涂抹一些布尔运算:
n a= b= c= r=
= bin nAND4 a>>1 bXOR7 nANDc dec
0 000 000 000 111 000 0
1 001 000 000 111 001 1
2 010 000 000 111 010 2
3 011 000 000 111 011 3
6 110 100 010 101 100 4
7 111 100 010 101 101 5
您需要翻译成Pythonian这一点。假设有一个数底2(否则转换如上图所示),在这里与lg(b)
,其中b
是你输入字节,那么这一切的一切,你有这样的
结果
r = ((((lg(b)) And 4) >> 1) Xor 7) And lg(b)
答
使用字典也许?
options = {
1: 0,
2: 1,
4: 2,
8: 3,
64: 4,
128: 5
}
def get_value(x):
return options.get(x, default_val)
答
创建与每个键 - 值对组成的byte
可能值作为密钥的,和对应的结果作为值的dictionary。
result = {
1: 0,
2: 1,
4: 2,
8: 3,
64: 4,
128: 5
}[byte]
请注意,该解决方案将抛出一个异常,如果byte
具有的值是不是在字典。你只需要稍微修改它来检查不同的值:
result = {
1: 0,
2: 1,
4: 2,
8: 3,
64: 4,
128: 5
}.get(byte, -1)
这会给-1的结果,如果byte
不是关键之一。
答
byte_dict = {'1':0, '2':1, '4':2, '8':3, '64':4, '128':5}
return byte_dict[str(byte)]
怎么样字典表示该将输入映射到输出? – Barmar