@@ -105,6 +105,28 @@ size_t Print::print(unsigned long n, int base)
105
105
else return printNumber (n, base);
106
106
}
107
107
108
+ size_t Print::print (long long n, int base)
109
+ {
110
+ if (base == 0 ) {
111
+ return write (n);
112
+ } else if (base == 10 ) {
113
+ if (n < 0 ) {
114
+ int t = print (' -' );
115
+ n = -n;
116
+ return printULLNumber (n, 10 ) + t;
117
+ }
118
+ return printULLNumber (n, 10 );
119
+ } else {
120
+ return printULLNumber (n, base);
121
+ }
122
+ }
123
+
124
+ size_t Print::print (unsigned long long n, int base)
125
+ {
126
+ if (base == 0 ) return write (n);
127
+ else return printULLNumber (n, base);
128
+ }
129
+
108
130
size_t Print::print (double n, int digits)
109
131
{
110
132
return printFloat (n, digits);
@@ -183,6 +205,20 @@ size_t Print::println(unsigned long num, int base)
183
205
return n;
184
206
}
185
207
208
+ size_t Print::println (long long num, int base)
209
+ {
210
+ size_t n = print (num, base);
211
+ n += println ();
212
+ return n;
213
+ }
214
+
215
+ size_t Print::println (unsigned long long num, int base)
216
+ {
217
+ size_t n = print (num, base);
218
+ n += println ();
219
+ return n;
220
+ }
221
+
186
222
size_t Print::println (double num, int digits)
187
223
{
188
224
size_t n = print (num, digits);
@@ -219,6 +255,81 @@ size_t Print::printNumber(unsigned long n, uint8_t base)
219
255
return write (str);
220
256
}
221
257
258
+ // REFERENCE IMPLEMENTATION FOR ULL
259
+ // size_t Print::printULLNumber(unsigned long long n, uint8_t base)
260
+ // {
261
+ // // if limited to base 10 and 16 the bufsize can be smaller
262
+ // char buf[65];
263
+ // char *str = &buf[64];
264
+
265
+ // *str = '\0';
266
+
267
+ // // prevent crash if called with base == 1
268
+ // if (base < 2) base = 10;
269
+
270
+ // do {
271
+ // unsigned long long t = n / base;
272
+ // char c = n - t * base; // faster than c = n%base;
273
+ // n = t;
274
+ // *--str = c < 10 ? c + '0' : c + 'A' - 10;
275
+ // } while(n);
276
+
277
+ // return write(str);
278
+ // }
279
+
280
+ // FAST IMPLEMENTATION FOR ULL
281
+ size_t Print::printULLNumber (unsigned long long n64, uint8_t base)
282
+ {
283
+ // if limited to base 10 and 16 the bufsize can be 20
284
+ char buf[64 ];
285
+ uint8_t i = 0 ;
286
+ uint8_t innerLoops = 0 ;
287
+
288
+ // prevent crash if called with base == 1
289
+ if (base < 2 ) base = 10 ;
290
+
291
+ // process chunks that fit in "16 bit math".
292
+ uint16_t top = 0xFFFF / base;
293
+ uint16_t th16 = 1 ;
294
+ while (th16 < top)
295
+ {
296
+ th16 *= base;
297
+ innerLoops++;
298
+ }
299
+
300
+ while (n64 > th16)
301
+ {
302
+ // 64 bit math part
303
+ uint64_t q = n64 / th16;
304
+ uint16_t r = n64 - q*th16;
305
+ n64 = q;
306
+
307
+ // 16 bit math loop to do remainder. (note buffer is filled reverse)
308
+ for (uint8_t j=0 ; j < innerLoops; j++)
309
+ {
310
+ uint16_t qq = r/base;
311
+ buf[i++] = r - qq*base;
312
+ r = qq;
313
+ }
314
+ }
315
+
316
+ uint16_t n16 = n64;
317
+ while (n16 > 0 )
318
+ {
319
+ uint16_t qq = n16/base;
320
+ buf[i++] = n16 - qq*base;
321
+ n16 = qq;
322
+ }
323
+
324
+ size_t bytes = i;
325
+ for (; i > 0 ; i--)
326
+ write ((char ) (buf[i - 1 ] < 10 ?
327
+ ' 0' + buf[i - 1 ] :
328
+ ' A' + buf[i - 1 ] - 10 ));
329
+
330
+ return bytes;
331
+ }
332
+
222
333
size_t Print::printFloat (double number, uint8_t digits)
223
334
{
224
335
size_t n = 0 ;
0 commit comments