2009-12-08 6 views
10

Soy un perdedor novato,¿Cómo puedo hacer aritmética de 64 bits en Perl?

¿Puedo simplemente usar la aritmética de 64 bits en Perl?

Por ejemplo

$operand1 = 0xFFFFFFFFFFFF; # 48 bit value 
$operand2 = 0xFFFFFFFFFFFF; # 48 bit value 

$Result = $operand1 * $operand2; 
  • Básicamente estoy buscando un reemplazo para el int64_t en Perl.
  • ¿Hay alguna manera de mencionar, si la variable está firmada o sin firmar?
+1

Está seguro de querer aritmética de 64 bits o grandes? ¿Desea que se desborde después de 64 bits? –

Respuesta

13

Sí, sin embargo, necesita tener Perl compilado con soporte de 64 bits.

+6

"use bigint" se asegurará de que siempre funcione. (Si desea velocidad absoluta, eligió el lenguaje de programación incorrecto). – jrockway

+4

Perl se usa a menudo en bioinformática y en otros campos que requieren un alto rendimiento. Si sus números están seguros de caber dentro de 64 bits, entonces esta respuesta creará un código de mejor rendimiento. Solo asegúrese de usar una versión reciente de Perl, y es posible que desee compilarla usted mismo. "La compatibilidad de 64 bits ahora se considera madura" http://dev.perl.org/perl5/news/2002/07/18/580ann/ – Colin

+7

Incluso con compatibilidad de 64 bits, necesitaría ' use integer; 'para evitar obtener un resultado de punto flotante (redondeado) y en su lugar obtener un resultado entero (de bits altos truncados). – ysth

5

Sí, Perl maneja automáticamente aritmética de números enteros grandes para usted. Sin embargo, Perl no ofrece una distinción entre tipos firmados y no firmados (no es necesario, ya que no hay límites fijos en el rango entero grande).

La página del manual perlnumber tiene más información sobre los diferentes formatos numéricos compatibles con Perl.

+0

No está claro a qué se refiere con "distinción entre valores firmados y no firmados"? – ysth

+0

Correcto, debería haber dicho "tipos" en lugar de "valores". Fijo. –

10

Ver bigint:

transparente BigInteger apoyo para Perl ...

Todos los operadores (incluyendo las operaciones matemáticas básicas), excepto el operador de rango .. están sobrecargados. Las constantes enteras se crean como BigInts propios.

Las constantes de punto flotante se truncan en enteros. Todas las partes y los resultados de las expresiones también se truncan.

A diferencia integer, este pragma crea constantes enteras que sólo están limitados en su tamaño por la memoria disponible y el tiempo de CPU ...

+0

+1 gracias, pero no pude usar funciones como hex() etc ~~~ – Alphaneo

+0

Alphaneo, en realidad puedes hacer '$ a = Math :: BigInt-> new (" 0x ". $ Your_int)' y '$ a-> as_hex() ' – osgx

0

Tenga en cuenta, la aritmética de 64 bits en Perl es uno, pero lo que se visualiza por sprintf% d% u y% s, es el segundo. La versión perl actual admite 64bits sin problemas, pero el formato sprintf% d no,% b del mismo modo.

0

use bigint hará que Perl maneje enteros de tamaño arbitrario correctamente sin desbordamiento de enteros.

Ej .:

use bigint; 
print 1 << 256; 

imprimirá:

115792089237316195423570985008687907853269984665640564039457584007913129639936 
Cuestiones relacionadas