Python位运算的困惑
我想出了这个“魔法字符串”,是为了符合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):这个操作会返回一个数字,只要在任意一个数的位上有值,就会在结果中显示出来。