@@ -94,6 +94,28 @@ size_t Print::print(unsigned long n, int base)
9494 else return printNumber (n, base);
9595}
9696
97+ size_t Print::print (long long n, int base)
98+ {
99+ if (base == 0 ) {
100+ return write (n);
101+ } else if (base == 10 ) {
102+ if (n < 0 ) {
103+ int t = print (' -' );
104+ n = -n;
105+ return printULLNumber (n, 10 ) + t;
106+ }
107+ return printULLNumber (n, 10 );
108+ } else {
109+ return printULLNumber (n, base);
110+ }
111+ }
112+
113+ size_t Print::print (unsigned long long n, int base)
114+ {
115+ if (base == 0 ) return write (n);
116+ else return printULLNumber (n, base);
117+ }
118+
97119size_t Print::print (double n, int digits)
98120{
99121 return printFloat (n, digits);
@@ -172,6 +194,20 @@ size_t Print::println(unsigned long num, int base)
172194 return n;
173195}
174196
197+ size_t Print::println (long long num, int base)
198+ {
199+ size_t n = print (num, base);
200+ n += println ();
201+ return n;
202+ }
203+
204+ size_t Print::println (unsigned long long num, int base)
205+ {
206+ size_t n = print (num, base);
207+ n += println ();
208+ return n;
209+ }
210+
175211size_t Print::println (double num, int digits)
176212{
177213 size_t n = print (num, digits);
@@ -218,6 +254,81 @@ size_t Print::printNumber(unsigned long n, uint8_t base)
218254 return write (str);
219255}
220256
257+ // REFERENCE IMPLEMENTATION FOR ULL
258+ // size_t Print::printULLNumber(unsigned long long n, uint8_t base)
259+ // {
260+ // // if limited to base 10 and 16 the bufsize can be smaller
261+ // char buf[65];
262+ // char *str = &buf[64];
263+
264+ // *str = '\0';
265+
266+ // // prevent crash if called with base == 1
267+ // if (base < 2) base = 10;
268+
269+ // do {
270+ // unsigned long long t = n / base;
271+ // char c = n - t * base; // faster than c = n%base;
272+ // n = t;
273+ // *--str = c < 10 ? c + '0' : c + 'A' - 10;
274+ // } while(n);
275+
276+ // return write(str);
277+ // }
278+
279+ // FAST IMPLEMENTATION FOR ULL
280+ size_t Print::printULLNumber (unsigned long long n64, uint8_t base)
281+ {
282+ // if limited to base 10 and 16 the bufsize can be 20
283+ char buf[64 ];
284+ uint8_t i = 0 ;
285+ uint8_t innerLoops = 0 ;
286+
287+ // prevent crash if called with base == 1
288+ if (base < 2 ) base = 10 ;
289+
290+ // process chunks that fit in "16 bit math".
291+ uint16_t top = 0xFFFF / base;
292+ uint16_t th16 = 1 ;
293+ while (th16 < top)
294+ {
295+ th16 *= base;
296+ innerLoops++;
297+ }
298+
299+ while (n64 > th16)
300+ {
301+ // 64 bit math part
302+ uint64_t q = n64 / th16;
303+ uint16_t r = n64 - q*th16;
304+ n64 = q;
305+
306+ // 16 bit math loop to do remainder. (note buffer is filled reverse)
307+ for (uint8_t j=0 ; j < innerLoops; j++)
308+ {
309+ uint16_t qq = r/base;
310+ buf[i++] = r - qq*base;
311+ r = qq;
312+ }
313+ }
314+
315+ uint16_t n16 = n64;
316+ while (n16 > 0 )
317+ {
318+ uint16_t qq = n16/base;
319+ buf[i++] = n16 - qq*base;
320+ n16 = qq;
321+ }
322+
323+ size_t bytes = i;
324+ for (; i > 0 ; i--)
325+ write ((char ) (buf[i - 1 ] < 10 ?
326+ ' 0' + buf[i - 1 ] :
327+ ' A' + buf[i - 1 ] - 10 ));
328+
329+ return bytes;
330+ }
331+
221332size_t Print::printFloat (double number, uint8_t digits)
222333{
223334 size_t n = 0 ;
@@ -262,3 +373,4 @@ size_t Print::printFloat(double number, uint8_t digits)
262373
263374 return n;
264375}
376+
0 commit comments