Buffer Circular sem comparação e com um contador

Uma forma clássica de circular um buffer é o velho:

 if (contador < XXX) contador ++; else contador = 0; 

Mas se o buffer tiver um tamanho potência de 2 (2^X) podemos facilmente suprimir o if e usar a operação AND como em

contador = (contador + 1) AND (maximo - 1)

Em C++/C fica:

 contador = (contador + 1) & [1 3 7 15 ... 255 511 ... 1023 ...]; 

Também é possível usar um mesmo contador para vários buffers de tamanhos diferentes:

contador++;
 bufferA[contador & 7] = ....
bufferB[contador & 255] = ...

Mas resista a tentação de fazer contador = contador++ & (max -1);  use o velho (contador + 1)  para evitar um erro dificil de se achar (tente).

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s