Re: Extracting bits out of huge numbers



On Jul 29, 10:28 pm, hofer <bla...@xxxxxxxxxx> wrote:
Hi,

I'd like to work with huge integers (> 64 bit precision)

Thus I can't use ordinary perl integers.

I thought Math::BigInt wouldn't be a too bad choice.

It's easy enough go create BigInts.
my $a = Math::BigInt->new("0x7777666655544443333222211110000");
my $b = Math::BigInt->new("0x1111111111111111111111111111111");

Calculating with them is also fine:
$a->badd($b); # $a = $a + $b

Now I would like to extract certain bits out of this huge number:

Example Bits 16 bis 12 should result in  0b00001 == 0x1 == 1
            Bits 17 bis 12 should result in 0b100001 == 0x21 == 33

So far I see two ways of doing this conversion.

However I'm not really appealed by either solution.

Do you know anything faster / better or even another CPAN module?


Math::GMP will allow you to access individual bits. I would expect it
to be siginificantly faster than Math::BigInt, though I haven't done
any benchmarking.

use warnings;
use Math::GMP;

$x = Math::GMP->new('12344' x 7);

# print the 10 least siginificant bits:

print Math::GMP::gmp_tstbit($x, $_) for reverse(0..9);
print "\n";

Cheers,
Rob
.