26.06.2012, 15:15
Bits Booleanos
Sem nada para fazer agora pela manhг resolvi criar um simples sistema de bits 1 e 0. Isto pode poupar sua memуria e amx em atй 32 vezes.
Qual melhora?
lvdm.amx sem BITS -> 4 mb
lvdm.amx com BITS -> 177kb
Cуdigo usado:
pawn Код:
// com bits
new Bit:arr<5000000>;
// sem bits
new arr[5000000]
Pode deixar a execuзгo mais lenta. Isto й obvio e ocorre em qualquer sistema de bits, mas nгo muito. A propуsito, este meu atй que ficou rбpido.
O que sгo bits? Como tiveram estб ideia genial?
Primeiramente, vou explicar como funciona manipulaзгo de alocaзгo por Bits
Primeiramente, vocк deve saber que "Bits nada mais nada menos sгo "Binary Digits" ou "Digitos Binбrios"."
-
Atualmente no pawn, podemos ter o seguinte valor mбximo em uma variбvel
pawn Код:
new var = cellmax;
pawn Код:
new var = cellmax + 1;
Pois bem, o valor 2147483647 ou cellmax equivale ao seguinte em binбrio:
Quote:
1111111111111111111111111111111 |
Entгo foi aн, que alguйm teve a idйia criativa de usar estes valores como uma array true e false
pawn Код:
new ab = 0b001
pawn Код:
new ab[3];
ab[0] = 0;
ab[1] = 0;
ab[2] = 1;
ou outro exemplo:
pawn Код:
new ab[3];
ab[0] = 1;
ab[1] = 0;
ab[2] = 1;
// equivale a "new ab = 0b101"
// "0b" indica que o nъmero й binбrio
Logo. Uma ъnica variбvel pode receber
pawn Код:
1111111111111111111111111111111
Sendo assim vocк nгo precisarб de uma array de [32] partes. Mas sim apenas uma array de [1] parte. Viu a memуria poupada?
Pois bem, existem varias formas de manipulaзгo destes valores. Desde usar strings para manipular ou atй mesmo cбlculos (que й o mais aconselhбvel)
Include
PHP код:
#define Bit_Lenght(%0) \
(sizeof(%0) * cellbits)
#define Bit:%0<%1> \
%0[(%1 +cellbits) / cellbits]
stock Bit_Get(bit[], pos, size = sizeof bit) {
new
index = (pos) / cellbits
;
return index > size || index < 0 ? false : (0 != (bit[index] & (1 << pos))) ;
}
stock Bit_Set(bit[], pos, bool:val, size = sizeof bit) {
new
index = (pos) / cellbits
;
return index > size || index < 0 ? 0 : (bit[index] = val ?(bit[index] | 1) << pos : bit[index] & ~(1 << pos)), 1;
}
Modo de uso e comparaзгo
pawn Код:
new Bit:bites<MAX_PLAYERS>;
printf("%d", Bit_Lenght(bites));
Bit_Set(bites, 499, true);
for(new i = Bit_Lenght(bites)-1 ; i > -1; i--) {
if(Bit_Get(bites, i)) {
printf("%d -> true", i);
}
}
499 -> true
Pois й o valor que usamos em set. O uso й simples:
Comparaзгo:
Array normal: new var[32];
Array bit: new Bit:var<32>; // var[1]
Memуria poupada em 32x
Colocando valor
Mйtodo normal-> var[499] = true;
Mйtodo Bits - > Bit_Set(var, 499, true);
Pegando valor
printf("metodo normal %d", var[499]);
printf("metodo bits %d", Bit_Get(var, 499));
-
-
-
Й isto. Espero que tenham gostado
Criado por Bruno da Silva