Python按位操作混乱

时间:2009-10-28 16:59:11

标签: python bit-manipulation id3

我想出了这个符合ID3标记规范的“魔术字符串”:

  

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

>>> hex_val = 0xFFFFFFFF
>>> str.format('0b{0:07b}{1:07b}{2:07b}{3:07b}', ((hex_val >> 24) & 0xEF),
                                                 ((hex_val >> 16) & 0xEF), 
                                                 ((hex_val >>  8) & 0xEF),
                                                 ((hex_val >>  0) & 0xEF))
'0b11101111111011111110111111101111'

为什么不相等:

'0b11111111111111111111111111111111'

如果有人关心,这似乎有效:

>>> int(str.format('0b{0:07b}{1:07b}{2:07b}{3:07b}', ((hex_val >> 24) & 0xFE),
                                                     ((hex_val >> 16) & 0xFE),
                                                     ((hex_val >>  8) & 0xFE), 
                                                     ((hex_val >>  0) & 0xFE)), 2)

3 个答案:

答案 0 :(得分:2)

我认为你混淆了和/或操作。

  • 按位和:返回一个只包含两个操作数的位的数字。
  • 按位或:返回一个数字,其中包含任何一个操作数集中的位。

答案 1 :(得分:1)

抱歉让我的7s和Es迷茫

更正后的代码:

>>> str.format('0b{0:07b}{1:07b}{2:07b}{3:07b}', ((hex_val >> 24) & 0x7F),
                                                 ((hex_val >> 16) & 0x7F),
                                                 ((hex_val >>  8) & 0x7F),
                                                 ((hex_val >>  0) & 0x7F))

答案 2 :(得分:1)

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