Python中的代数(比交换机更好的东西?)

时间:2014-06-07 15:00:18

标签: python algebra

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

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'

...等等。

必须有更好的方法吗?

2 个答案:

答案 0 :(得分:7)

您可以使用bitwise arithmetic

的强大功能执行此操作
def switches(n, num=4):
    return [n & (2**i) > 0 for i in range(num)]

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

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

答案 1 :(得分:1)

使用bitwise operations检查不同的密钥。选择常量,以便每个修饰符由不同的位表示。

MOD_SHIFT       = 0b00000001  # ==  1
MOD_CONTROL     = 0b00000010  # ==  2
MOD_ALT         = 0b00000100  # ==  4
MOD_WIN         = 0b00001000  # ==  8

这意味着,您可以通过{{1}将各个值组合在一起来表示多个修改键。

or

另一方面,如果您想知道是否按下了特定键,请使用MOD_ALT|MOD_WIN = 0b00001100 # == 12

and

在特定情况下很难说如何处理这个问题。我猜你真的不想打印出按键。向我们提供更多信息,我们可以提供更好的帮助。