এটি ইনট (স্বাক্ষরিত 16-বিট পূর্ণসংখ্যার) কে স্ট্রিংয়ে রূপান্তর করার জন্য গতি-অনুকূলিত সমাধান।
এই প্রয়োগটি বিভাগ ব্যবহার করা এড়িয়ে চলেছে যেহেতু আরডুইনোর জন্য ব্যবহৃত 8-বিট এভিআরের কোনও হার্ডওয়্যার ডিআইভি নির্দেশ নেই, সংকলক বিভাগকে সময় গ্রহণকারী পুনরাবৃত্তিক বিয়োগগুলিতে অনুবাদ করে। সুতরাং দ্রুততম সমাধানটি স্ট্রিং তৈরি করতে শর্তাধীন শাখা ব্যবহার করা হয়।
গতিশীল বরাদ্দ এড়াতে র্যামের শুরু থেকে প্রস্তুত একটি স্থির 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 বাইটে সংকলন করা হয়েছে যা আরডুইনো ভি 1.0.5 এর সাথে বান্ডিল হয়েছে (ইন্ট 2 হ'ল ফাংশনের আকার নিজেই 594 বাইট)। স্ট্রিং অবজেক্টটি ২,৯৯৮ বাইটে সংকলিত সমাধানের সাথে তুলনা করে, এই বাস্তবায়নটি আপনার কোডের আকারকে 1.2 কেবি কমাতে পারে (ধরে নেওয়া হয়েছে যে আপনার কোনও স্ট্রিংয়ের অবজেক্ট পদ্ধতির দরকার নেই, এবং আপনার সংখ্যা স্বাক্ষরিত ইনট টাইপের ক্ষেত্রে কঠোর)।
এই ফাংশনটি সঠিক এসেম্বলারের কোডটিতে লিখে আরও অনুকূলিত করা যায়।