Cita de: brunoxzx en Febrero 23, 2013, 08:03:36 AM
Cita de: ferhand en Febrero 22, 2013, 10:56:28 PM
  Si hay algún tipo de datos binario en GML lo desconozco y solicito me lo muestren para aprender.  :-[ [/color]
EJem todos?¿, quizás quisiste decir boleano.

   Saludos makero brunoxzx:

   No, no quice decir "buleano", me refería a "binario" esos números que están formados con ceros y unos y la posición de cada dígito influye ne el valor que representan...

  No logro encontrar nada en GM para implementarlos y he tenido que utilizar una cadena de texto para eso. Por lo que se vuelve más costoso en cuanto a memoria pues cada "caracter" pesa entre uno y dos megas.
 


#16 Febrero 28, 2013, 08:31:26 AM Ultima modificación: Febrero 28, 2013, 08:36:31 AM por brunoxzx
Cita de: ferhand en Febrero 27, 2013, 07:36:30 PM
   Saludos makero brunoxzx:
  No logro encontrar nada en GM para implementarlos y he tenido que utilizar una cadena de texto para eso. Por lo que se vuelve más costoso en cuanto a memoria pues cada "caracter" pesa entre uno y dos megas.
 

1 y 2 megas? no se a que te refieras con megas(mega bytes?) pero cada carácter pesa un byte osea 8 bits osea un numero entre 0 y 255, o al menos eso es en la codificación ascii, creo que en unicode cada carácter es de 2 bytes no estoy seguro de cual use gm.


Cita de: ferhand en Febrero 27, 2013, 07:36:30 PM
   Saludos makero brunoxzx:
   No, no quice decir "buleano", me refería a "binario" esos números que están formados con ceros y unos y la posición de cada dígito influye ne el valor que representan...
 

Uhm, es que en realidad todos los números están en binario al igual que cualquier dato en una computadora lo está.

Por ejemplo: tu computadora ve un diez en decimal como un 1010 (que es 10 en binario), bueno en realidad la computadora le pone un montón de ceros atrás para que se complete el numero de bits que mide la variable, por ejemplo una variable de 16 bits (o 2 bytes) sin signo representa el numero 10 de esté modo 0000 0000 0000 1010. Creo que las variables de gm son de 64 bits.

Bueno ahora para manejar los bits de un numero se usan los operadores a nivel de bits usándolos puedes modificar los bits de un numero. Por ejemplo las funciones de desplazamiento a la derecha(>>)  e izquieda(<<) mueven los bits de un numero un determinado numero de posiciones a la dirección indicada.

(5 << 3) // moverá los bits de 5 en tres posiciones a la izquierda.
//5=0101:  (0101 << 3) = 0101000 = 40.

//ahora lo mismo pero al revez.
(40 >> 3) // moverá los bits de 40 en tres posiciones a la derecha.
//40=0101000:  (0101000 >> 3) = 0000101 = 5.
.

Ahora, lo que tu quieres quizás sea usar algo como:
[gml]
var a;
a=bin(0, 0, 1, 1) * bin(0, 1, 0, 0);
//que es igual a 7 * 4 = 28[/gml]

ok, puedes construir una función para hacerlo. nota es para gm8.1 o superior ya que otras versiones no tienen la maravilla de usar argumentos como arrays lo cual es genial!.
[gml]
//Ejemplo de uso bin(1, 0, 1, 1);
var n;
n=0;
for(i=1; i<=argument_count; i+=1){
     n = n | (argument[argument_count-i] << (i-1));
}
return(n);
[/gml]

ese sería un script, para hacer las conversaciones. No le veo mucha utilidad, pero quizás la tenga. Ademas solo acepta 16 argumentos osea que el numero más grande que puedes hacer es el 65535.

También se puede hacer un script que haga lo contrario, es decir que te devuelva el binario de un numero en decimal. El problema sería como devolver el numero, quizás una lista con ceros y unos o un string. Aunque le veo más utilidad al string por que ese puedes dibujarlo (de hecho no le veo utilidad a una función como está mas que para dibujar el resultado en binario), de esté modo podrías hacer algo como esto.

[gml]
var a;
a=bin(0, 0, 1, 1) * bin(0, 1, 0, 0);
//que es igual a 7 * 4 = 28 = 11100
show_message( bin_get( a ) ); // debería mostrar 11100[/gml]

Ahora, lo que tu quieres quizás sea usar algo como:
[gml]
var a;
a=bin(0, 0, 1, 1) * bin(0, 1, 0, 0);
//que es igual a 7 * 4 = 28[/gml]


¿Mmm... de dónde sale el 7?

Cita de: brunoxzx en Febrero 28, 2013, 08:31:26 AM
Cita de: ferhand en Febrero 27, 2013, 07:36:30 PM
   Saludos makero brunoxzx:
  No logro encontrar nada en GM para implementarlos y he tenido que utilizar una cadena de texto para eso. Por lo que se vuelve más costoso en cuanto a memoria pues cada "caracter" pesa entre uno y dos megas.
 

1 y 2 megas? no se a que te refieras con megas(mega bytes?) pero cada carácter pesa un byte osea 8 bits osea un numero entre 0 y 255, o al menos eso es en la codificación ascii, creo que en unicode cada carácter es de 2 bytes no estoy seguro de cual use gm.

  Disculpa makero brunoxzx:

   Quise decir Bytes y no Mega Bytes, gracias por aclararlo.  :-[

  Al tener que utilizar "strings" para representar un número en binario el costo en memoria RAM es de uno a dos bytes por caracter.   8)

Muy costoso.  :-[ 


Cita de: penumbra en Febrero 28, 2013, 10:45:06 AM
Ahora, lo que tu quieres quizás sea usar algo como:
[gml]
var a;
a=bin(0, 0, 1, 1) * bin(0, 1, 0, 0);
//que es igual a 7 * 4 = 28[/gml]


¿Mmm... de dónde sale el 7?

   El makero penumbra tiene razón... ¿Dónde está el siete (7)?  XD 

  Yo veo un tres (3)...  :-[ 

  Es una lástima que no tenga el GM8.1 para probar esas funciones nuevas...

  Lucen muy interesantes.  ;D


Cita de: ferhand en Febrero 28, 2013, 08:35:46 PM
Cita de: penumbra en Febrero 28, 2013, 10:45:06 AM
Ahora, lo que tu quieres quizás sea usar algo como:
[gml]
var a;
a=bin(0, 0, 1, 1) * bin(0, 1, 0, 0);
//que es igual a 7 * 4 = 28[/gml]


¿Mmm... de dónde sale el 7?

   El makero penumbra tiene razón... ¿Dónde está el siete (7)?  XD 

  Yo veo un tres (3)...  :-[ 

Ah, perdón el sueño no me dejaba ver correctamente  XD quise decir bin(1, 1, 1) (a decir verdad sigo viendo un 3  :P), de hecho tampoco es necesario poner los ceros a la izquierda no se por que los puse.

Sobre lo de los códigos, estoy a punto de morir de sueño si gustas mañana los adapto a gm8, aunque en gm8 seguro que serán mas grandes y feos los códigos.

Ahora un chite para que te rias un poco, cuando lei de el titulo del post, lo primero que pense fue.
- Y por que Fer... No usa mejor sprites o modelos si son mas practicos. jajajaja

Cita de: elviskelley en Marzo 02, 2013, 01:51:43 AM
Ahora un chite para que te rias un poco, cuando lei de el titulo del post, lo primero que pense fue.
- Y por que Fer... No usa mejor sprites o modelos si son mas practicos. jajajaja
Hacer un generador de arboles aleatorios estilo Minecraft estaria bueno, ahora que diste la idea :P
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


#22 Marzo 03, 2013, 07:49:59 AM Ultima modificación: Marzo 03, 2013, 08:01:49 AM por brunoxzx
Sí, yo al leer el titulo también me imagine algo como esto. Pero de igual modo también resulto ser algo interesante.

Hice la adaptación del script a gm8 y se ve como algo en extremo lento y horrible ademas de que necesitas especificar el numero de argumentos.

[gml]
//Se tiene que especificar el numero de argumentos...
//ej bin(6, 1, 0, 1, 0, 1, 0)  = 42;
var n;
n=0;
n= n | (argument1 << (argument0-1) );
if argument0 < 2 return (n);
n= n | (argument2 << (argument0-2) );
if argument0 < 3 return (n);
n= n | (argument3 << (argument0-3) );
if argument0 < 4 return (n);
n= n | (argument4 << (argument0-4) );
if argument0 < 5 return (n);
n= n | (argument5 << (argument0-5) );
if argument0 < 6 return (n);
n= n | (argument6 << (argument0-6) );
if argument0 < 7 return (n);
n= n | (argument7 << (argument0-7) );
if argument0 < 8 return (n);
n= n | (argument8 << (argument0-8) );
if argument0 < 9 return (n);
n= n | (argument9 << (argument0-9) );
if argument0 < 10 return (n);
n= n | (argument10 << (argument0-10) );
if argument0 < 11 return (n);
n= n | (argument11 << (argument0-11) );
if argument0 < 12 return (n);
n= n | (argument12 << (argument0-12) );
if argument0 < 13 return (n);
n= n | (argument13 << (argument0-13) );
if argument0 < 14 return (n);
n= n | (argument14 << (argument0-14) );
if argument0 < 15 return (n);
n= n | (argument15 << (argument0-15) );
return(n);
[/gml]

Lo vez! es enorme, quizás lo mejor y más rápido sea limitar el numero de argumentos, por ejemplo a 4:
[gml]
return( (argument0 << 3 ) + (argument1 << 2 ) + (argument2 << 1 ) + argument3 );
//puedes reemplazar el "+" con un "|", pero no se que sea más rápido.
[/gml]
mucho más bonito, pensándolo bien quizás sea mejor así, aunque tienes que reyenar con ceros el resto,
bin(0, 0, 0, 1) está bien pero NO bin(1) ni bin(0, 1).

El script para transformar un numero en decimal a uno en binario y devolverlo como string podria ser.
[gml]
//get_bit(255, 31);
//aunque para 255 basta con 8 bits.
//get_bit(255, 8);
//argument0 numero
//argument1 cuantos bits se checan (no recomiendo usar más de 31(mas el 0 son 32) ).
str="";
for(i=argument1; i>=0; i-=1){
    if ( (argument0 >> i) & 1 ) begin str=str+"1" end;
    else begin str=str+"0" end;
}
return(str);
[/gml]

También hice estas dos para obtener el bit que tiene un numero en la posición indicada.
[gml]//argument0 numero.
//argument1 posicion.
return( (argument0>>argument1) & 1 );[/gml]

y esté para cambiar un bit de un numero en la posicion indicada a 1, quizás sea mejor uno para invertirlo.
[gml]
//argument0 numero;
//argument1 posicion;
return( argument0 | (1 << argument1) );
[/gml]