View Single Post
larito
Veteran Member
Join Date: Nov 2008
Location: Argentina- Mendoza
Old 07-16-2009 , 17:05   Re: [ES] Recopilacion de Tutoriales v1.2
#57

Link original del post

Tutorial
: Aca veremos como puede usarse los opreadores de bitsum como booleans
Requisito: Este tutorial es para buenos programadores.

Que es un bitsum?
Un bitsum se basa en la manera que trabaja la memoria. Si pensamos, la memoria es un chip que contiene celdas(bits)que pueden contener 2 informaciones : 1 o 0. Esto se guarda en un byte (byte = 8 bits), de esta manera:
PHP Code:
"8" (un numero normal) = "00001000" (numero de moria [1 byte]) 

Como es que trabaja un bitsum?

La idea es que un bitsum permite controla las posisciones que uste quiera setear en 1, Y pedemos chequear las posiciones que tiene 1 o 0

Cuales operadores tengo y que puedo hacer?
Aca hay un ejemplo con cada operador que se pueda usar
PHP Code:
Operador: | (logical OR"http://es.wikipedia.org/wiki/OR#Definici.C3.B3n")
first_byte "10010001"
second_byte "01010001"

first_byte second_byte "11010001" 
Este operador trabaga como el operador logico || pero este es con cada bit

PHP Code:
|     1      0
1     1      1
0     1      0 
PHP Code:
Operador: & (logical AND "http://es.wikipedia.org/wiki/AND#Puerta_Y_.28AND.29")
first_byte "10010001"
second_byte "01010001"

first_byte second_byte "0001001" 
Este operador trabaja como el operador logico && pero este es con cada bit

PHP Code:
&     1      0
1     1      0
0     0      0 
PHP Code:
Operator: ^ (Exclusive OR "http://es.wikipedia.org/wiki/AND#Puerta_OR-exclusiva_.28XOR.29")
first_byte "10010001"
second_byte "01010001"

first_byte second_byte "1100000" 
Este operador trabaja como el operador logico ^^ pero este es con cada bit
PHP Code:
^    1      0
1    0      1
0    1      0 
PHP Code:
Operator: ~ ("http://es.wikipedia.org/wiki/AND#L.C3.B3gica_negada")
first_byte "10010001"

~first_byte "01101110" 
Este operador niega cada bit ! Asique 0 se transforma en 1 y 1 en 0.
PHP Code:
~0
~
Como trabaja un bitsum en numeros normales?
Estos estan guardados en las celdas de un byte normal.Entonses estos se combierten de la base 10 a la base 2. En este caso el numero 9 , por ejemplo "00001001". Para comvertir el numero de vuelta a 9 necesitamos multiplicarlo cada uno en posicion con el 2! 2^2 = power(2^2) = 4
00001001: 1*(2^0) + 0*(2^1) + 0*(2^2) + 1*(2^3) + 0*(2^4) + 0*(2^5) + 0*(2^6) + 0*(2^7) = 1 + 8 = 9

Como puedo crear un bitsum?
Para esto necesitamos 2 operadores << y >>, o si tu no quieres usar estos operadores puede fasilmente crear uno usando los elementos que representan potencias del 2

Ejemplo:
PHP Code:
Bitsum "00001111" 
El segundo operador tiene un especial intecion
"<< x" quiere decir que el numero 1 se mueve x ceces a la izquierda!

Ejemplo:
PHP Code:
"00001100" << "00011000" 
Cuando convertimos esto a un numero normal podemos ver este numero normal es multiplicado por la potencia de 2

Entonses si tenemos (1<<3) seria como 2^3 * 1

El operador >> es igual al << solo que mueve X veces el numero a la derecha! Cuando uses numeros enteros desapareceran
PHP Code:
"00000111" >> "00000000" 
Entonses usamos estos 2 operadores para crear un bitsum y tenemos esto

PHP Code:
Bitsum "00001111" = (1<<1<<1<<1<<0
Como puedo usar esto en mi codigo?
Bien si puedes usarlo como si fuera un boolean

Entonses en ves de tener esto
PHP Code:
new bool:is_alive[33
Tenemos
PHP Code:
new bitsum_is_alive 
Entonses usamos menos memoria

En lugar de
PHP Code:
if (is_alive[id])
{

Tenemos
PHP Code:
if (bistum_is_alive & (1<<id))
{

En lugar de esto
PHP Code:
is_alive[id] = true 
is_alive
[id] = false 
Tenemos esto
PHP Code:
bitsum_is_alive |= (1<<id
bitsum_is_alive &=  ~(1<<id
Lo bueno de esto es que puedes extender el limite de los 32 slots (el numero permitido por un array) entonses podemos tener mas slots!

Ejemplo:
PHP Code:
new holder[4]
// Holder tiene 4 * 32 espacios donde podemos guardar un valor true/false

// Aqui estan las funciones que nos permiten manipularlos! 

// Aqui isimos un slot verdadero
save(x)
{
    
holder[32] |= << (32);
}

// Aqui chequeamos el slot
exists(x)
{
    return 
holder[32] & << (32);
}

// Aqui removemos el slot
remove(x)
{
    
holder[32] &= ~(<< (32))

Como puedes ver es mas difisil usar un bitsum pero tienen mejor resultado cuando se refiere al poco uso de memoria

Espero que les sirva de ayuda

PD: esto aun no lo entiendo bien , asique no puedo contestar muchas dudas.
PD2: la ultima parte de save, exists y remove, no entendi como eran las cuentas pero si alguien las entiende bien que las explique mejor plis


Cualquier error de traduccion por favor diganmelo.
__________________
Facebook: Ariel Berardi

Last edited by larito; 07-16-2009 at 17:49.
larito is offline
Send a message via MSN to larito