Python按位运算混淆

Posted

技术标签:

【中文标题】Python按位运算混淆【英文标题】:Python bitwise operations confusion 【发布时间】:2009-10-28 16:59:11 【问题描述】:

我想出了这个“魔术字符串”来满足 ID3 标记规范:

ID3v2 标签大小用四个字节编码,其中每个字节的最高有效位(第 7 位)设置为零,总共 28 位。零位被忽略,因此一个 257 字节长的标签表示为 $00 00 02 01。

>>> hex_val = 0xFFFFFFFF
>>> str.format('0b0:07b1:07b2:07b3:07b', ((hex_val >> 24) & 0xEF),
                                                 ((hex_val >> 16) & 0xEF), 
                                                 ((hex_val >>  8) & 0xEF),
                                                 ((hex_val >>  0) & 0xEF))
'0b11101111111011111110111111101111'

为什么不等于:

'0b11111111111111111111111111111111'

?

如果有人关心,这似乎可行:

>>> int(str.format('0b0:07b1:07b2:07b3:07b', ((hex_val >> 24) & 0xFE),
                                                     ((hex_val >> 16) & 0xFE),
                                                     ((hex_val >>  8) & 0xFE), 
                                                     ((hex_val >>  0) & 0xFE)), 2)

【问题讨论】:

>>> str.format('0b0:07b1:07b2:07b3:07b', ((hex_val >> 24) & 0x7F), ((hex_val >> 16) & 0x7F), ((hex_val >> 8) & 0x7F), ((hex_val >> 0) & 0x7F)) '0b1111111111111111111111111111' 对不起,把我的 E 和 7s 弄糊涂了。 【参考方案1】:

我认为您混淆了 and 和 or 操作。

按位与:返回一个仅包含两个操作数集中的位的数字。 按位或:返回一个数字,其位在任一操作数集中。

【讨论】:

【参考方案2】:

抱歉让我的 7s 和 Es 混淆了

更正的代码:

>>> str.format('0b0:07b1:07b2:07b3:07b', ((hex_val >> 24) & 0x7F),
                                                 ((hex_val >> 16) & 0x7F),
                                                 ((hex_val >>  8) & 0x7F),
                                                 ((hex_val >>  0) & 0x7F))

【讨论】:

您应该更正问题而不是添加答案(很抱歉与其他建议相矛盾,我猜卡尔认为您不是原始发帖人)。 (哦,我认为 kaizer.se 有正确的答案)。【参考方案3】:

它不等于所有的,因为您使用 & 运算符屏蔽了第 4 位!

【讨论】:

以上是关于Python按位运算混淆的主要内容,如果未能解决你的问题,请参考以下文章

AI基础python:openCV——图像算术运算:按位运算

Python 列表到按位运算

python 按位运算符

除了按位否定运算之外,“~”在 python 中还有啥作用? [复制]

Python 运算符Ⅴ

Python_位运算符