@@ -385,6 +385,56 @@ proc main() =
385385 doAssert " fedcba9876543210" .initBigInt (base = 16 ) == b
386386 doAssert " ftn5qj1r58cgg" .initBigInt (base = 32 ) == b
387387
388+ block : # fastLog2
389+ let a = one shl 31
390+ let b = a shl 1
391+ let c = initBigInt (0x fedcba9876543210 'u64 )
392+ let d = initBigInt (" ffffffffffffffffff" , base = 16 )
393+
394+ # first numbers
395+ doAssert fastLog2 (2 .initBigInt) == 1
396+ doAssert fastLog2 (3 .initBigInt) == 1
397+ doAssert fastLog2 (4 .initBigInt) == 2
398+ doAssert fastLog2 (5 .initBigInt) == 2
399+ doAssert fastLog2 (7 .initBigInt) == 2
400+ doAssert fastLog2 (8 .initBigInt) == 3
401+ doAssert fastLog2 (24 .initBigInt) == 4
402+ doAssert fastLog2 (32 .initBigInt) == 5
403+ doAssert fastLog2 (48 .initBigInt) == 5
404+
405+ # one limb
406+ doAssert fastLog2 (a) == 31
407+
408+ # two limbs and more
409+ doAssert fastLog2 (b) == 32
410+ doAssert fastLog2 (b+ a) == 32
411+ doAssert fastLog2 (c+ b+ a) == 63
412+
413+ doAssert fastLog2 (d) == 71
414+ doAssert fastLog2 (d + one) == 72
415+ doAssert fastLog2 (d - one) == 71
416+ doAssert fastLog2 (- d) == 71
417+ doAssert fastLog2 (- d - one) == 72
418+ doAssert fastLog2 (- d + one) == 71
419+
420+ # negative BigInts
421+ doAssert fastLog2 (- 2 .initBigInt) == 1
422+ doAssert fastLog2 (- 3 .initBigInt) == 1
423+ doAssert fastLog2 (- 4 .initBigInt) == 2
424+ doAssert fastLog2 (- 5 .initBigInt) == 2
425+ doAssert fastLog2 (- 7 .initBigInt) == 2
426+ doAssert fastLog2 (- 8 .initBigInt) == 3
427+ doAssert fastLog2 (- 24 .initBigInt) == 4
428+ doAssert fastLog2 (- 32 .initBigInt) == 5
429+ doAssert fastLog2 (- 48 .initBigInt) == 5
430+ doAssert fastLog2 (- a) == 31
431+ doAssert fastLog2 (- b) == 32
432+
433+ # edge cases
434+ doAssert fastLog2 (one) == 0
435+ doAssert fastLog2 (zero) == - 1
436+
437+
388438 block : # pow
389439 let a = " 14075287" .initBigInt
390440 doAssert pow (a, 0 ) == one
0 commit comments