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