[Include] Bits Booleanos - O que sгo bits?
#1

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]
Sу usa-se para arrays de true e false !!

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;
Cellmax й o mбximo valor que se pode ter em uma array/variбvel. Caso vocк tente

pawn Код:
new var = cellmax + 1;
Nгo darб certo! Isto retorna em notaзгo cientifica pois pawn nгo tem suporte para nъmeros maiores que cellmax

Pois bem, o valor 2147483647 ou cellmax equivale ao seguinte em binбrio:
Quote:

1111111111111111111111111111111

(digitos binбrios sгo 1 e 0. APENAS)

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
Em bits booleanos. Isto equivale a:
pawn Код:
new ab[3];
ab[0] = 0;
ab[1] = 0;
ab[2] = 1;
Note: 001 e 001

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
Note 0b101

Logo. Uma ъnica variбvel pode receber
pawn Код:
1111111111111111111111111111111
ou 32 elementos em valor 1 conforme o nъmero acima ou valor 0 ..

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[(%+cellbits) / cellbits]
        
stock Bit_Get(bit[], possize sizeof bit) {
    new
        
index = (pos) / cellbits
    
;
     return 
index size || index false : (!= (bit[index] & (<< pos))) ;
}
stock Bit_Set(bit[], posbool:valsize sizeof bit) {
    new
        
index = (pos) / cellbits
    
;
    return 
index size || index : (bit[index] = val ?(bit[index] | 1) << pos bit[index] & ~(<< pos)), 1;

Pastebin: http://pastebin.com/S4DbCEAL


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);
        }
    }
Isto deverб imprimir
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
Reply
#2

First

Vo ler tуpico e dou edit -q

@EDIT
Legal ,mas qual й a funзгo disso ?
Reply
#3

FistІ two.

Edito Jб jб vou ver o tutorial.


@Edit:
Gostei, vai ajudar muita gente, apesar de eu nгo entender muito bom, mas parabйns pelo Tutorial.
Reply
#4

Quote:
Originally Posted by Ades
Посмотреть сообщение
First

Vo ler tуpico e dou edit -q
Ri.

Quote:
Originally Posted by Truck
Посмотреть сообщение
FistІ two.

Edito Jб jб vou ver o tutorial.
Ri ++;

-
-
-
Importante:

Bits existem em vбrias linguagens. Mas aconselha-se o uso em Pawn pois pawn sу aceita variбveis de 32 e arrays de 8, char/32



Tambйm pode usar "format" para manipular bits. Proponho atй um desafio para quem consiga, й bastante fбcil.

Ex

#define getBitStr(%0,%1) %0[(%1 + cellbits)/ 32][%1]
#define setBitStr(%0,%1,%2) %0[(%1 + cellbits)/ 32][%1] = !!%2

Й similar, a lуgica й a mesma o problema й que vai ocupar as arrays do mesmo jeito, pois cada caractere tem sua prуpria parte dentro da array striing
Reply
#5

/\ Que nubisses desses ae.

@Topic
Boa include.
Reply
#6

hum... Vou testar e vou ver se realmente ha diferenзa, pois nгo sou muito chegado a bytes e nгo conheзo muito isso ae!

@LoL
Nгo entendi esse desafio!
Reply
#7

Parabйns DraKins, mas uma vez , belo trabalho
Reply
#8

#off
o que seria de um processador sem os bits

#topic
gostei man, vai ajudar muita gente
Reply
#9

hmm, bela explicaзгo.
Reply
#10

A explicaзгo mais simples й:

Em bits, um nъmero й visto como uma array, onde cada digito do nъmero em binбrio equivale a uma determinada parte da array.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)