Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 标志的位操作?_Python_Bit Manipulation_Flags - Fatal编程技术网

Python 标志的位操作?

Python 标志的位操作?,python,bit-manipulation,flags,Python,Bit Manipulation,Flags,我见过一些使用位操作来创建选项/标志的代码 例如,从下面的例子中考虑: #按位AND和NOT ctx=ssl.create\u default\u context(Purpose.CLIENT\u AUTH) ctx.options&=~ssl.OP\u NO\u SSLv3 #按位或 客户端上下文=ssl.SSLContext(ssl.PROTOCOL\u TLS\u客户端) client_context.options |=ssl.OP_NO_TLSv1 client_context.opt

我见过一些使用位操作来创建选项/标志的代码

例如,从下面的例子中考虑:

#按位AND和NOT
ctx=ssl.create\u default\u context(Purpose.CLIENT\u AUTH)
ctx.options&=~ssl.OP\u NO\u SSLv3
#按位或
客户端上下文=ssl.SSLContext(ssl.PROTOCOL\u TLS\u客户端)
client_context.options |=ssl.OP_NO_TLSv1
client_context.options |=ssl.OP_NO_TLSv1_1
这些标志的数值为:

>>ssl.OP\u NO\u SSLv3.value
33554432
>>>ssl.OP_NO_TLSv1.value
67108864
>>>ssl.OP_NO_TLSv1_1.value
268435456
我不明白这种创建旗帜的系统是如何工作的,或者这些数字是如何选择的。我已经研究了操作员是如何工作的,但我仍然感到困惑


有人能解释一下这是如何工作的,以及合适的用例吗?

当你以二进制形式看这些数字时,它们似乎不那么随机:)


每个选项都只是设置或清除的单个位。

除非您在头脑中自动将十进制转换为二进制,否则打印标志簇的十进制值是愚蠢的。根据您的喜好,以二进制、八进制或十六进制打印

典型的用例是

  • 一组相关的布尔值
  • 二进制字段的密集序列,如机器代码操作
把这些看作是布尔人的密密麻麻的记录。例如,您可能需要跟踪对象权限(读写修改销毁)。您可以将其作为四个单独的布尔值来执行,或者只需生成一个值来对所有四个布尔值进行编码。例如,仅具有读取和销毁权限的人,
R--D
,其权限值为
1001
,或0x9

当您想要检查特定的权限时,您可以使用位操作来屏蔽不需要的权限。例如:

r_mask = b'1000
w_mask = b'0100
m_mask = b'0010
d_mask = b'0001
现在,检查很简单。要查看某人是否具有对象的读取权限,请执行以下操作:

if obj.permission & d_mask:
    # Allow operation
要更改该值,您可以允许该操作授予写入或修改权限:

if obj.permission & (w_mask | m_mask):
或者如果你是一个死记硬背密码的人:

if obj.permission & b'0110':

当您使用小型字段的压缩记录时,例如机器代码或通信协议,从传输字中提取一个字段非常有用。 例如,如果您需要从指令中获取操作码,您可以屏蔽除(比如)5个操作码位以外的所有操作码位,并将它们移到字的右边缘:

op_mask = 0x7c00                         # bits 30-26 hold the op code
opcode = (instruction & op_mask) >> 26   # Shift right 26 bits

欢迎来到SO!也许如果你试着把这些数字转换成基数2,它们会更有意义。
op_mask = 0x7c00                         # bits 30-26 hold the op code
opcode = (instruction & op_mask) >> 26   # Shift right 26 bits