Estou numa situacao em que preciso organizar a ordem dos bits de um byte em um grande loop, então digo "melhor" no aspecto do performance, com menos instrucoes de conversoes possivel, mais instrucoes nativas do cpu (baixo nivel, tipo xor).
Pra ser mais especifico:
Eu tenho uma array shift Integer() que contem a ordem dos bits. E claro um array "buffer" de bytes.
Por exemplo:
Dim shift as Integer() {2,1,0,7,5,4,6,3}
dim buffer as Byte() 'variable with data
no caso acima e com um byte tipo 10010111, o mesmo deve se tornar 00110011.
assim:
------------------------
De: 10010111
Para : 00110011
------------------------
sguindo a ordem do "shift" pelos seus indices.
Parece um problema simples, mas a performance e' realmente critica aqui (o loop e' imenso).
Com o codigo que tenho atualmente consigo realizar isso mas construindo o byte com uma concatecanao de um objeto StringBuilder, porem a velocidade e' muito lenta:
Private Sub ShiftMe(ByVal buffer As Byte(), ByVal shift As Integer())
'Lets shift byte's columns
Dim worker As New System.Text.StringBuilder
Dim bkupArray As Boolean()
ReDim bkupArray(7)
For p As Integer = 0 To buffer.GetUpperBound(0)
'Separate each bit of byte
bkupArray(0) = buffer(p) And 1
bkupArray(1) = (buffer(p) And 2) >> 1
bkupArray(2) = (buffer(p) And 4) >> 2
bkupArray(3) = (buffer(p) And 8) >> 3
bkupArray(4) = (buffer(p) And 16) >> 4
bkupArray(5) = (buffer(p) And 32) >> 5
bkupArray(6) = (buffer(p) And 64) >> 6
bkupArray(7) = (buffer(p) And 128) >> 7
'Create Shifted byte
buffer(p) = 0 'clean old byte
worker.Remove(0, worker.Length)
worker.Append(bkupArray(shift(7)) & bkupArray(shift(6)) & bkupArray(shift(5)) & bkupArray(shift(4)) & bkupArray(shift(3)) & bkupArray(shift(2)) & bkupArray(shift(1)) & bkupArray(shift(0)))
buffer(p) = StrToByteArray(worker.ToString)
Next
End Sub
meu estoque de criatividade de logicas já se esgotou, se alguém tiver alguma dica está valendo..
Pergunta
Thiago Alencar
Qual e a melhor forma de se manipular bits?
Estou numa situacao em que preciso organizar a ordem dos bits de um byte em um grande loop, então digo "melhor" no aspecto do performance, com menos instrucoes de conversoes possivel, mais instrucoes nativas do cpu (baixo nivel, tipo xor).
Pra ser mais especifico:
Eu tenho uma array shift Integer() que contem a ordem dos bits. E claro um array "buffer" de bytes.
Por exemplo:
Dim shift as Integer() {2,1,0,7,5,4,6,3}
dim buffer as Byte() 'variable with data
no caso acima e com um byte tipo 10010111, o mesmo deve se tornar 00110011.
assim:
------------------------
De: 10010111
Para : 00110011
------------------------
sguindo a ordem do "shift" pelos seus indices.
Parece um problema simples, mas a performance e' realmente critica aqui (o loop e' imenso).
Com o codigo que tenho atualmente consigo realizar isso mas construindo o byte com uma concatecanao de um objeto StringBuilder, porem a velocidade e' muito lenta:
meu estoque de criatividade de logicas já se esgotou, se alguém tiver alguma dica está valendo..
valeu!
Editado por Thiago AlencarLink para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.