Nikita
Nikita

Reputation: 857

perl. convert 64-bit binary number to decimal

I have a string contains 64 binary symbols.

I need to convert it into the decimal number. How can I do it in perl?

sub bin2dec {
    return unpack("N", pack("B64", substr("0" x 64 . shift, -64)));
}

doesn't work. it converts just first 32 bit.

Upvotes: 3

Views: 2635

Answers (2)

ikegami
ikegami

Reputation: 385809

From the docs,

N  An unsigned long (32-bit) in "network" (big-endian) order.

The 64 bit equivalent would be "Q>".

q  A signed quad (64-bit) value.
Q  An unsigned quad value.
  (Quads are available only if your system supports 64-bit
  integer values _and_ if Perl has been compiled to support
  those. Raises an exception otherwise.)

>   sSiIlLqQ   Force big-endian byte-order on the type.
    jJfFdDpP   (The "big end" touches the construct.)

So you could use the following:

unpack("Q>", pack("B64", substr("0" x 64 . shift, -64)))

That said, the above is needlessly complicated. Whoever coded that was was probably not aware of oct's ability to parse binary numbers because the above can be reduced to

oct("0b" . shift)

But what do you do if you don't have a 64-bit build of Perl? You need to use some kind of object that overloads math operations. You could use Math::BigInt, but I suspect that won't be nearly as fast as Math::Int64.

use Math::Int64 qw( string_to_int64 );
string_to_int64(shift, 2)

For example,

$ perl -MMath::Int64=string_to_int64 -E'say string_to_int64(shift, 2);' \
   100000000000000000000000000000000
4294967296

Upvotes: 9

ArtMat
ArtMat

Reputation: 2150

use Math::BigInt;
my $b = Math::BigInt->new('0b1010000110100001101000011010000110100001101000011010000110100001');
print $b;

Just the idea, not an equivalent code to your subroutine.
The binary number here is an arbitrary one. Use yours.

Upvotes: 4

Related Questions