2009-10-28 4 views
0

я придумал эту «волшебную строку» для удовлетворения ID3 тегов спецификации:Python битовые операции путаница

Размер тегов 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) 
+1

>>> 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)) '0b1111111111111111111111111111' Извините, сбив с толку E и 7s. – bsl

+0

Напишите это как ответ! –

ответ

2

Я думаю, что вы путаете и и или операции.

  • Побитовое и: возвращать число только с битами, находящимися в обоих операндах.
  • побитовое или: вернуть число с битами, находящимися в любом из установленных операндов.
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)) 
+0

Вы должны исправить вопрос, а не добавить ответ (извините, что противоречили другому совету, я думаю, Карл думал, что вы кто-то, кроме оригинального плаката). (О, и я думаю, что у kaizer.se есть правильный ответ). –

1

Это не равно все те, потому что вы маскировки 4-й бит с помощью оператора &!