Ini adalah solusi kecepatan yang dioptimalkan untuk mengonversi int (bertanda integer 16-bit) menjadi string.
Implementasi ini menghindari penggunaan pembagian karena AVR 8-bit yang digunakan untuk Arduino tidak memiliki instruksi DIV perangkat keras, kompilator menerjemahkan pembagian menjadi pengurangan berulang yang memakan waktu. Jadi solusi tercepat adalah menggunakan cabang bersyarat untuk membangun string.
Buffer tetap 7 byte yang disiapkan dari awal dalam RAM untuk menghindari alokasi dinamis. Karena hanya 7 byte, biaya penggunaan RAM tetap dianggap minimum. Untuk membantu compiler, kami menambahkan pengubah register ke dalam deklarasi variabel untuk mempercepat eksekusi.
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() {}
Sketsa ini dikompilasi menjadi 1.082 byte kode menggunakan avr-gcc yang dibundel dengan Arduino v1.0.5 (ukuran fungsi int2str sendiri adalah 594 byte). Dibandingkan dengan solusi menggunakan objek String yang dikompilasi menjadi 2.398 byte, implementasi ini dapat mengurangi ukuran kode Anda sebesar 1.2 Kb (diasumsikan bahwa Anda tidak memerlukan metode objek String lain, dan nomor Anda ketat untuk tipe int bertanda tangan).
Fungsi ini dapat dioptimalkan lebih jauh dengan menuliskannya dalam kode assembler yang tepat.