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]
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]