Python中的代数(比开关更好吗?)

Python中的代数(比开关更好吗?),python,algebra,Python,Algebra,我构建了一个套接字服务器,用于侦听来自另一台客户机(我无权访问的代码)的命令。客户端发送一个与按键笔划相关的数字,并发送一个与修改器按键相关的修改器代码。比如说 shift=1 control=2 alt=4 win=8 发送的修改器代码始终为一个数字。e、 g.修饰语=1。但如果发送的键超过1个,则可以说修改器=3(即shift+control)。问题是我如何从数字中计算出键是什么 因此,为了使这变得简单,让我们使用a,b,c,d-规则在组合中只是每个规则中的一个 因此,如果: a=1 b=

我构建了一个套接字服务器,用于侦听来自另一台客户机(我无权访问的代码)的命令。客户端发送一个与按键笔划相关的数字,并发送一个与修改器按键相关的修改器代码。比如说

shift=1
control=2
alt=4
win=8
发送的修改器代码始终为一个数字。e、 g.修饰语=1。但如果发送的键超过1个,则可以说修改器=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'
……等等


一定有更好的方法,对吗?

您可以通过以下功能来实现:

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

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

这就是为什么组件都是2的幂,当你把总数看成二进制数(注逆顺序):

时,它会使每个开关的值变得微不足道。 要显示所有选项,请执行以下操作:

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

您可以通过以下功能完成此操作:

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

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

这就是为什么组件都是2的幂,当你把总数看成二进制数(注逆顺序):

时,它会使每个开关的值变得微不足道。 要显示所有选项,请执行以下操作:

>>> 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
用于检查不同的键。选择常量,以便每个修改器由不同的位表示

MOD_SHIFT       = 0b00000001  # ==  1
MOD_CONTROL     = 0b00000010  # ==  2
MOD_ALT         = 0b00000100  # ==  4
MOD_WIN         = 0b00001000  # ==  8
这意味着,您可以通过
将各个值组合在一起来表示按下的多个修改器键

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

if keys_pressed & MOD_SHIFT:
    print "Shift key is pressed."
很难说在你的具体情况下如何处理。我想你真的不想把按下的键打印出来。请提供更多信息,我们可能会提供更好的帮助。

用于检查不同的键。选择常量,以便每个修改器由不同的位表示

MOD_SHIFT       = 0b00000001  # ==  1
MOD_CONTROL     = 0b00000010  # ==  2
MOD_ALT         = 0b00000100  # ==  4
MOD_WIN         = 0b00001000  # ==  8
这意味着,您可以通过
将各个值组合在一起来表示按下的多个修改器键

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

if keys_pressed & MOD_SHIFT:
    print "Shift key is pressed."

很难说在你的具体情况下如何处理。我想你真的不想把按下的键打印出来。给我们更多的信息,我们可能会提供更好的帮助。

搜索“位域”会很有趣。(我知道你可能只是打个比方说“switch”,但Python没有像C一样的switch语句。)a+C+d和
b+C+d
有什么问题吗?@jornsharpe!刚刚错过了这两个:)“位域”将是一个有趣的搜索。(我知道你可能只是打个比方说“switch”,但Python没有像C这样的switch语句。)
a+C+d
b+C+d
有什么问题吗?@jornsharpe!刚刚错过了这两个:)是的,但是
0x00001000
不是8。@thg435:大脑放屁。但是你本可以编辑我的答案而不是“聪明”的,你知道吗?如果我的评论冒犯了你,很抱歉,谢谢你的修改。@thg435:无意冒犯!我是认真的:可以自己修复这些明显的错误是的,但是
0x000011000
不是8。@thg435:brain fart。但是你本可以编辑我的答案而不是“聪明”的,你知道吗?如果我的评论冒犯了你,很抱歉,谢谢你的修改。@thg435:无意冒犯!我是认真的:请自行修复这些明显的错误,至少使用
非常感谢。由于从未在大学学习过comp-sci,也没有在php中学习过python,所以当涉及到“比特”和任何涉及数学的东西时,我确实感到完全不知所措。。。再次感谢。另外,至少使用
非常感谢。由于从未在大学学习过comp-sci,也没有在php中学习过python,所以当涉及到“比特”和任何涉及数学的东西时,我确实感到完全不知所措。。。再次感谢。