Skip to main content
 首页 » 编程设计

python之Python 中的代数(比开关更好的东西)

2025年05月04日11artech

我已经构建了一个套接字服务器,用于监听来自另一台客户端计算机(我无权访问的代码)的命令。客户端发送一个与击键相关的数字,并发送一个与修改键按下相关的修改代码。例如

shift=1 
control=2 
alt=4 
win=8 

发送的修饰符代码始终是一个数字。例如修饰符=1。但是如果发送的键超过 1 个,则可以说 modifier=3(即 shift+control)。问题是我如何根据数字计算出键是什么。

所以为了使这个简单,让我们使用 a,b,c,d- 规则只是组合中的每一个。

如果:

a=1 
b=2 
c=4 
d=8 

那么这些就是组合的总数:

a+b=> 3 
a+c=> 5 
a+d=> 9 
b+d=> 10 
c+b=> 6 
c+d=> 12 
 
a+b+c=> 7 
a+b+d=> 11 
 
a+b+c+d=> 15 

那么在 Python 中计算 n 的最佳方法是什么?开关?

switch(n): 
    case 3: 
        print 'its a+b' 
     case 5: 
         print 'its a+c' 

...等..

一定有更好的方法吧?

请您参考如下方法:

您可以利用 bitwise arithmetic 的力量做到这一点:

def switches(n, num=4): 
    return [n & (2**i) > 0 for i in range(num)] 

这将返回一个列表,其中每个项目都是一个 bool 值,指示是否按下了该开关:

>>> switches(10) 
[False, True, False, True] 
#  a      b     c      d  

这就是为什么组件都是 2 的幂 - 当您将总数视为二进制数(注意倒序)时,访问每个开关的值变得微不足道:

>>> format(10, 'b') # show 10 as a binary number 
'1010' 
#8421 
#dcba 

显示所有选项:

>>> for i in range(2**4): 
    print(i, '\t', format(i, '04b')) 
 
 
0    0000 # no switches 
1    0001 # a only 
2    0010 
3    0011 
4    0100 
5    0101 
6    0110 
7    0111 # a, b and c 
8    1000 
9    1001 
10   1010 # b and d 
11   1011 
12   1100 
13   1101 
14   1110 
15   1111 # all switches