นี่คือโซลูชันที่ปรับให้เหมาะสมกับความเร็วสำหรับการแปลง int (จำนวนเต็ม 16 บิตที่ลงชื่อ) เป็นสตริง
การใช้งานนี้หลีกเลี่ยงการใช้การหารเนื่องจาก AVR 8 บิตที่ใช้สำหรับ Arduino ไม่มีคำสั่ง DIV ของฮาร์ดแวร์คอมไพลเลอร์จะแปลการหารเป็นการลบซ้ำที่ใช้เวลานาน ดังนั้นวิธีแก้ปัญหาที่เร็วที่สุดคือการใช้สาขาเงื่อนไขเพื่อสร้างสตริง
บัฟเฟอร์ 7 ไบต์คงที่ที่เตรียมไว้ตั้งแต่ต้นใน RAM เพื่อหลีกเลี่ยงการจัดสรรแบบไดนามิก เนื่องจากมีเพียง 7 ไบต์ค่าใช้จ่ายในการใช้ RAM คงที่จึงถือว่าเป็นขั้นต่ำ เพื่อช่วยคอมไพเลอร์เราเพิ่มรีจิสเตอร์โมดิฟายเออร์ในการประกาศตัวแปรเพื่อเร่งการดำเนินการ
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 ไบต์โดยใช้ avr-gcc ซึ่งมาพร้อมกับ Arduino v1.0.5 (ขนาดของฟังก์ชัน int2str คือ 594 ไบต์) เมื่อเทียบกับโซลูชันโดยใช้อ็อบเจกต์ String ซึ่งคอมไพล์เป็น 2,398 ไบต์การใช้งานนี้สามารถลดขนาดโค้ดของคุณได้ 1.2 Kb (สมมติว่าคุณไม่ต้องการเมธอดอ็อบเจ็กต์ของ String อื่น ๆ และหมายเลขของคุณเข้มงวดสำหรับประเภท int ที่ลงนาม)
ฟังก์ชันนี้สามารถปรับให้เหมาะสมเพิ่มเติมได้โดยเขียนลงในโค้ดแอสเซมเบลอร์ที่เหมาะสม