在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
创建字典是可能的,但仍然很长,有数学方法吗? 感谢。
答案 0 :(得分:3)
创建一个dictionary,每个键值对包含一个可能的值byte
作为键,相应的结果作为值。
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)
如果byte
不是其中一个键,则结果为-1。
答案 1 :(得分:2)
可能使用字典吗?
options = {
1: 0,
2: 1,
4: 2,
8: 3,
64: 4,
128: 5
}
def get_value(x):
return options.get(x, default_val)
答案 2 :(得分:1)
byte_dict = {'1':0, '2':1, '4':2, '8':3, '64':4, '128':5}
return byte_dict[str(byte)]
答案 3 :(得分:1)
如果您坚持使用非字典解决方案,则可以使用对数基数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)