Or Math::BigNum if one has a large number of calculations and needs a bit more speed.
use 5.016;
use Test::More qw(no_plan);
use Math::BigNum;
for (51..66) {
# no need to substr to remove 0b prefix
my $s = Math::BigNum->new(2)->bpow($_)->bdec->as_bin;
is length($s), $_, "1 << $_ -1";
}
__END__
ok 1 - 1 << 51 -1
ok 2 - 1 << 52 -1
ok 3 - 1 << 53 -1
ok 4 - 1 << 54 -1
ok 5 - 1 << 55 -1
ok 6 - 1 << 56 -1
ok 7 - 1 << 57 -1
ok 8 - 1 << 58 -1
ok 9 - 1 << 59 -1
ok 10 - 1 << 60 -1
ok 11 - 1 << 61 -1
ok 12 - 1 << 62 -1
ok 13 - 1 << 63 -1
ok 14 - 1 << 64 -1
ok 15 - 1 << 65 -1
ok 16 - 1 << 66 -1
1..16