python中使用

发布时间:2024-12-04 19:19

如何在Python中使用PIL处理图片 #生活技巧# #数码产品使用技巧# #设计软件使用技巧#

对于整数,它是按位OR复合赋值运算符.像所有复合赋值运算符一样,| = b与a = a |相同湾管道是按位OR的符号.

正如user2357112所指出的那样,更丰富的数据类型可以在他们认为合适的情况下使用overload this.

可能的用例

假设您有一些想要通过慢速网络传输的二进制值.假设您有6个开关的输出,每个开关的值可以是0或1.

例如,你有一个列表:switches = [0,1,1,0,1,0,0,0]

传输它的天真方式是6个不同的整数值.如果你使用字节来传输值,它总共是6 * 8 = 48位.但是你只能在接收端获得6位信息 – 所以剩下的42位被浪费了.

相反,您可以使用单个字节来存储所有交换机的信息.

一种方法是迭代列表,并计算结果字节.

例如,

val = 0

for i,s in enumerate(switches):

val |= (s << i)

print(val)

这个片段打印22,如果你要转换为二进制,你会看到它是10110,或00010110 – 这只是列表的值,向后排序.

(s<< i)生成一个整数,当以二进制表示时,该整数包含单个1和其余0.因此,在循环的每次迭代中,val变量可以“累积”另一个位. 我能想到的一个相对简单的现实生活示例就是PHP存储它的方式error level constants.

如果查看链接,则第一列中的值全部(除最后一个条目外)的值为2 ^ n,n = 0,1,2,3 … 14.

事实上,(2 ^ n)对于位域和按位运算具有特殊意义.

看看n的前几个值的值,我们得到:

n | 2^n | 2^n (Binary Representation)

---|-----|----

0 | 1 | 00001

1 | 2 | 00010

2 | 4 | 00100

3 | 8 | 01000

4 | 16 | 10000

如果,在二进制表示中,您从最右边的位置向左移动n个点,您将看到您在单个1的位置结束.这是完全有意的.

回到PHP.让我们说,作为服务器管理员只对各种错误级别的子集感兴趣.例如,您知道要显示E_ERROR,E_PARSE和E_CORE_ERROR,同时丢弃其余部分.

好吧,因为PHP巧妙地为我们刚看到的(2 ^ n)值分配了不同的错误级别,我们能够用单个值表示这些标志的任意组合而不会丢失信息.

我们可以通过采用值的按位OR来以与以前相同的方式计算此组合的值.在我们的情况下:

E_ERROR | 1 | 0000 0000 0000 0001

E_PARSE | 4 | 0000 0000 0000 0100

E_CORE_ERROR | 16 | 0000 0000 0001 0000

----------------------------------------

21 0000 0000 0001 0101

在python中:

print(1|4|16)

# 21

这种按位OR运算的结果通常称为bitmask.

给定一个位掩码和抛出错误的错误值,您可以快速检查它是否是您感兴趣的东西 – 也就是说,它是E_ERROR,E_PARSE还是E_CORE_ERROR类型 – 您可以快速计算按位AND位掩码和错误值.

此AND运算的结果将为0(在这种情况下,您对错误不感兴趣/它不是您感兴趣的级别之一)或非零(在这种情况下它是) .验证这个按位AND操作是否符合我的说法,由您完成.

最后,您可能已经注意到,简单地添加错误值会产生与从OR-ing获得的值相同的值.在这种情况下,这是真的.那么为什么使用bitwise-OR而不是简单的加法呢?

答案:因为按位或运算具有多次包含值的弹性.

这很难解释,所以请考虑最后一个例子:

您希望编写能够确保“监视”给定错误级别的代码.您可以访问将获取和设置位掩码的函数.

使用添加,您可以编写如下内容:

set_mask(get_mask() + E_PARSE)

但是如果已经设置了E_PARSE的位,那么执行此添加实际上将取消设置E_PARSE,并且可能更重要的是,将使至少一个额外标志无效 – 可能使位域中的每个标志无效.

显然,这不是你想要的.

相反,如果您使用按位OR运算:

set_mask(get_mask() | E_PARSE)

无论先前是否设置了E_PARSE,并且无论您执行此操作多少次,E_PARSE都将在每次操作后保持设置,并且不会无意中影响其他标志.

(做这一切背后的数学 – 它是非常有启发性的)

网址:python中使用 https://www.yuejiaxmz.com/news/view/375872

下一篇:吴文雄

相关内容

使用Python开发基于Python的虚拟助手
Python操作Excel的Xlwings教程(八)——Excel使用VBA调用Python
使用Python自动下载电视节目
Python Base64模块的使用
【Python】ftfy 包的理解和使用
python serial模块的使用
如何使用 Python 自动化日常任务
设备使用python连接阿里Iot
python在生活过中的应用
AppTask: 使用Python实现日常APP任务自动化

随便看看