2009-01-27 18 views

Respuesta

23
sub bin2dec { 
    return unpack("N", pack("B32", substr("0" x 32 . shift, -32))); 
} 
+3

Cada herramienta te pido me dice que se traduce en 111111111111111111111111111111111 8589934591. ¿Qué tan seguro está de que 42949672958589934591 es la correcta? – innaM

+2

Esto también lo hace el oct() incorporado, aunque es un nombre bastante pobre para él. –

56

Mi forma preferida es:

$x_num = oct("0b" . $x_bin); 

citando de man perlfunc:

 
    oct EXPR 
    oct  Interprets EXPR as an octal string and returns the 
      corresponding value. (If EXPR happens to start 
      off with "0x", interprets it as a hex string. If 
      EXPR starts off with "0b", it is interpreted as a 
      binary string. Leading whitespace is ignored in 
      all three cases.) 
+1

Eso es ... impactante. Gracias. – innaM

+0

@edg: eso es de esperar en una plataforma de 32 bits; funciona para mí con 64 bits, aunque con una advertencia de portabilidad. – ysth

+2

Siempre utilicé pack, pero acabo de comparar pack, oct y Bit :: Vector y este es por lejos el más rápido de los tres. Es un 1449% más rápido que Bit :: Vector y un 316% más rápido que el paquete en mi sistema. – gpojd

12

Como de costumbre, hay también un módulo CPAN excelente que debe ser mencionado aquí: Bit::Vector .

La transformación sería algo como esto:

use Bit::Vector; 

my $v = Bit::Vector->new_Bin(32, '0001001100101'); 
print "hex: ", $v->to_Hex(), "\n"; 
print "dec: ", $v->to_Dec(), "\n"; 

Las cadenas binarias pueden ser de casi cualquier longitud y se puede hacer otra cosa sencilla como bits de desplazamiento, etc.

6

En realidad sólo se puede pegue '0b' en el frente y se trata como un número binario.

perl -le 'print 0b101' 
5 

Pero esto solo funciona para una palabra.

0

Usted puede utilizar el método eval() para evitar el pelado-palabra restricción:

eval "\$num=0b$str;"; 
Cuestiones relacionadas