Olá pessoal, será que alguém consegue me explicar o que este método está fazendo, que tipo de calculo está sendo realizado. :?:
int readInt16() {
short shorty = 0;
int b1 = AudioData[readpos++];
int b2 = AudioData[readpos++];
shorty = (short) (((b1 & 0xFF) | (b2 & 0xFF) << 8) & 0xFFFF);
return (int) shorty;
}
Este AudioData é um array de int. Ele armazena o conteúdo de um arquivo de áudio .wav da minha aplicação… Tem milhares de posições (+50.000).
Eu sei que ele trabalha pegando 2 posições do vetor, faz um cálculo sobre eles, e retorna um único valor. E seu plotar estes novos valores extraídos deste array, eu obtenho um gráfico da onda sonora.
Ele faz exatamente o que eu preciso, ou seja, extrair a onda sonora deste arquivo de áudio.
Porém, eu encontrei este método pronto na internet… Ele funciona como o esperado, mas eu gostaria de saber que tipo de operação está sendo realizada na LINHA 6.
Para entender esse método, você tem que entender o que os operadores de bit-a-bit fazem.
& - Efetua a operação "and" em cada bit dos dois valores fornecidos
| - Efetua a operação "or" em cada bit dos dois valores fornecidos
N << Y - Desloca o número N, Y bits para esquerda
b1 & 0xFF = Pega o valor do último byte de b1. Por exemplo, vamos supor que b1 tivesse o valor:
11101101 11101101
Com a máscara 0xFF:
00000000 11111111
Teríamos como resultado:
(b2 & 0xFF) << 8 = Paga o valor do último byte de B2, e desloca 8 bits para esquerda
Ou seja, se ao final da operação com o & o valor do último byte de b2 for 11001111, o << 8 vai transforma-lo em: 11001111 00000000
O | combina os bytes b1 e b2, para formar um short. Assim:
Não entendi para que serve o último &. Ele faria o mesmo que no caso de b1 e b2, mas combinar o que já tem 2 bits dessa forma acabará com um número rigorosamente igual: