Esta es una solución de velocidad optimizada para convertir int (entero de 16 bits con signo) en una cadena.
Esta implementación evita el uso de la división, ya que el AVR de 8 bits utilizado para Arduino no tiene instrucción DIV de hardware, el compilador traduce la división en sustracciones repetitivas que consumen mucho tiempo. Por lo tanto, la solución más rápida es usar ramas condicionales para construir la cadena.
Un búfer fijo de 7 bytes preparado desde el principio en RAM para evitar la asignación dinámica. Dado que solo tiene 7 bytes, el costo del uso de RAM fija se considera mínimo. Para ayudar al compilador, agregamos un modificador de registro en la declaración de variable para acelerar la ejecución.
char _int2str[7];
char* int2str( register int i ) {
register unsigned char L = 1;
register char c;
register boolean m = false;
register char b; // lower-byte of i
// negative
if ( i < 0 ) {
_int2str[ 0 ] = '-';
i = -i;
}
else L = 0;
// ten-thousands
if( i > 9999 ) {
c = i < 20000 ? 1
: i < 30000 ? 2
: 3;
_int2str[ L++ ] = c + 48;
i -= c * 10000;
m = true;
}
// thousands
if( i > 999 ) {
c = i < 5000
? ( i < 3000
? ( i < 2000 ? 1 : 2 )
: i < 4000 ? 3 : 4
)
: i < 8000
? ( i < 6000
? 5
: i < 7000 ? 6 : 7
)
: i < 9000 ? 8 : 9;
_int2str[ L++ ] = c + 48;
i -= c * 1000;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// hundreds
if( i > 99 ) {
c = i < 500
? ( i < 300
? ( i < 200 ? 1 : 2 )
: i < 400 ? 3 : 4
)
: i < 800
? ( i < 600
? 5
: i < 700 ? 6 : 7
)
: i < 900 ? 8 : 9;
_int2str[ L++ ] = c + 48;
i -= c * 100;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// decades (check on lower byte to optimize code)
b = char( i );
if( b > 9 ) {
c = b < 50
? ( b < 30
? ( b < 20 ? 1 : 2 )
: b < 40 ? 3 : 4
)
: b < 80
? ( i < 60
? 5
: i < 70 ? 6 : 7
)
: i < 90 ? 8 : 9;
_int2str[ L++ ] = c + 48;
b -= c * 10;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// last digit
_int2str[ L++ ] = b + 48;
// null terminator
_int2str[ L ] = 0;
return _int2str;
}
// Usage example:
int i = -12345;
char* s;
void setup() {
s = int2str( i );
}
void loop() {}
Este boceto se compila en 1.082 bytes de código utilizando avr-gcc que se incluye con Arduino v1.0.5 (el tamaño de la función int2str en sí es de 594 bytes). En comparación con la solución que usa un objeto String que se compiló en 2,398 bytes, esta implementación puede reducir el tamaño de su código en 1.2 Kb (asumiendo que no necesita otro método de objeto String, y su número es estricto para el tipo int firmado).
Esta función se puede optimizar aún más escribiéndola en el código ensamblador adecuado.