Python位运算的困惑

0 投票
3 回答
1347 浏览
提问于 2025-04-15 15:27

我想出了这个“魔法字符串”,是为了符合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 个回答

1

这并不等于全是1,因为你用&运算符把第4位给屏蔽掉了!

1

抱歉,我把7和E搞混了。

修正后的代码:

>>> 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

我觉得你可能把“与”和“或”这两个操作搞混了。

  • 位与(bitwise and):这个操作会返回一个数字,只有在两个数都有的位上才会有值。
  • 位或(bitwise or):这个操作会返回一个数字,只要在任意一个数的位上有值,就会在结果中显示出来。

撰写回答