@@ -94,6 +94,28 @@ size_t Print::print(unsigned long n, int base)
94
94
else return printNumber (n, base);
95
95
}
96
96
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
+
97
119
size_t Print::print (double n, int digits)
98
120
{
99
121
return printFloat (n, digits);
@@ -172,6 +194,20 @@ size_t Print::println(unsigned long num, int base)
172
194
return n;
173
195
}
174
196
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
+
175
211
size_t Print::println (double num, int digits)
176
212
{
177
213
size_t n = print (num, digits);
@@ -218,6 +254,81 @@ size_t Print::printNumber(unsigned long n, uint8_t base)
218
254
return write (str);
219
255
}
220
256
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
+
221
332
size_t Print::printFloat (double number, uint8_t digits)
222
333
{
223
334
size_t n = 0 ;
@@ -262,3 +373,4 @@ size_t Print::printFloat(double number, uint8_t digits)
262
373
263
374
return n;
264
375
}
376
+
0 commit comments