2017-08-17 43 views
0

有没有更简单的方法来这个在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

创建字典是可能的,但仍然很长,有没有数学方法? 谢谢。

+1

怎么样字典表示该将输入映射到输出? – Barmar

回答

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) 
2

使用字典也许?

options = { 
    1: 0, 
    2: 1, 
    4: 2, 
    8: 3, 
    64: 4, 
    128: 5 
} 
def get_value(x): 
    return options.get(x, default_val) 
3

创建与每个键 - 值对组成的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不是关键之一。

+0

@haccks早期版本? – stybl

+0

没关系。我在谈论你在第一次编辑之前发布的单行文本。 – haccks

1
byte_dict = {'1':0, '2':1, '4':2, '8':3, '64':4, '128':5} 
return byte_dict[str(byte)]