Bu, int (işaretli 16 bitlik tamsayıyı) dizeye dönüştürmek için hızı optimize edilmiş bir çözümdür.
Bu uygulama, Arduino için kullanılan 8-bit AVR'nin donanımsal DIV talimatı içermediğinden, bölmeyi kullanmaktan kaçınır; derleyici, bölmeyi zaman alıcı tekrarlayan çıkarmalara çevirir. Bu nedenle en hızlı çözüm, dizeyi oluşturmak için koşullu dalları kullanmaktır.
Dinamik ayırmadan kaçınmak için RAM'de baştan hazırlanan 7 baytlık sabit bir arabellek. Yalnızca 7 bayt olduğu için sabit RAM kullanım maliyeti minimum kabul edilir. Derleyiciye yardımcı olmak için, yürütmeyi hızlandırmak için değişken bildirimine kayıt değiştiricisi ekliyoruz.
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() {}
Bu taslak, Arduino v1.0.5 ile birlikte gelen avr-gcc kullanılarak 1.082 bayt koda derlenmiştir (int2str işlevinin boyutu 594 bayttır). 2.398 bayta derlenen String nesnesini kullanan çözümle karşılaştırıldığında, bu uygulama kod boyutunuzu 1.2 Kb azaltabilir (başka String'in nesne yöntemine ihtiyacınız olmadığı ve sayınızın imzalı int türüne göre kesin olduğu varsayılmıştır).
Bu fonksiyon, uygun montajcı koduyla yazılarak daha da optimize edilebilir.