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