97d o id do item fica "espalhado" pelo binário
então supondo que vc tenha um hex
[FF] [FF] [FF] [FFFFFFFF] [FF] [FF] [FF]
o id do item está aqui
[FF] [FF] [FF] [FFFFFFFF] [FF] [FF] [FF]
E aqui
[FF] [FF] [FF] [FFFFFFFF] [FF] [FF] [FF]
então supondo que isso seja um vetor de bytes (10 bytes)
vc pode calcular o index/section do item assim:
section = ((item[0] & 0xE0) >> 5) | ((item[7] & 0x80) >> 4);
index = (item[0] & 0x1F)
o primeiro byte tá subdividido entre indice e seção
X X X Y Y Y Y Y
X é a seção (3 bits, valor máximo (111) = 7)
e Y é o índice do item (5 bits, valor máximo (11111) = 31) ... é aqui um dos motivos que 97d só ter 32 itens... 0 a 31
então pra extrair as informações é usado uma "máscara" só com os bits que eu quero (bitwise &)
E0 = 11100000
valor & E0
como eu extraí 3 bits do do "fim" do byte, eu preciso realinhar o valor 5 bits pra direita, por isso o ">> 5"
(valor & E0) >> 5
como a gente só tem 3 bits da seção no primeiro byte, precisa extrair do 8º byte o bit que falta (3 bits até agora, +1 = 4 bits, que dá valor máximo 15... 0 a 15 = 16 seções), e segue a mesma lógica...
se o bit lá tiver ativado, ele é "colado" no type do item, gerando o valor completo do mesmo
pra fazer isso segue a mesma lógica do primeiro byte...
é meio complicado pra quem não tem prática nem muito conhecimento dos operadores de bit, mas espero que tenha servido pra dar uma idéia!
abraço!
Marcadores