यह int (स्ट्रिंग में हस्ताक्षरित 16-बिट पूर्णांक) को परिवर्तित करने के लिए गति-अनुकूलित समाधान है।
यह कार्यान्वयन विभाजन का उपयोग करने से बचता है क्योंकि Arduino के लिए 8-बिट AVR का उपयोग कोई हार्डवेयर DIV निर्देश नहीं है, संकलक समय विभाजन को दोहराए जाने वाले घटाव में अनुवाद करता है। इस प्रकार सबसे तेज़ समाधान स्ट्रिंग बनाने के लिए सशर्त शाखाओं का उपयोग कर रहा है।
डायनामिक आवंटन से बचने के लिए रैम में शुरुआत से तैयार एक 7 बाइट्स बफर। चूंकि यह केवल 7 बाइट्स है, इसलिए फिक्स्ड रैम उपयोग की लागत न्यूनतम मानी जाती है। संकलक की सहायता करने के लिए, हम गति संशोधन के लिए चर घोषणा में रजिस्टर संशोधक जोड़ते हैं।
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() {}
यह स्केच कोड के 1,082 बाइट्स के लिए संकलित किया गया है, जिसमें एवर-जीसीसी का उपयोग किया गया है जो Arduino v1.0.5 के साथ बंडल किया गया है (int2str फ़ंक्शन का आकार स्वयं 594 बाइट्स है)। स्ट्रिंग ऑब्जेक्ट का उपयोग करके समाधान के साथ तुलना में जो 2,398 बाइट्स में संकलित किया गया है, यह कार्यान्वयन आपके कोड का आकार 1.2 Kb तक कम कर सकता है (यह मानकर कि आपको किसी अन्य स्ट्रिंग की ऑब्जेक्ट विधि की आवश्यकता नहीं है, और आपका नंबर हस्ताक्षरित इंट प्रकार के लिए सख्त है)।
इस फ़ंक्शन को आगे उचित कोडांतरक कोड में लिखकर अनुकूलित किया जा सकता है।