Inicio > Python Básico > Día 14 “Enteros largos y Operadores Binarios en Python”

Día 14 “Enteros largos y Operadores Binarios en Python”

Hola hoy voy a ser dos post en uno, ya que realmente son breves Python posee un rico conjunto de tipos de datos, en el post anterior hablamos de los números complejos, ahora vamos a ver brevemente los enteros largos. El rango de los números flotantes puede resultar insuficiente para ciertas aplicaciones. Python ofrece la posibilidad de trabajar con números de cifras arbitrariamente largos. Un entero largo siempre finaliza con la letra L.  Aquí un ejemplo Fíjate números enteros cambian automáticamente a enteros largos cuando es necesario.

Observa la “L” que aparece, aunque 2 y 31 son números enteros normales, el resultado de evaluar 2**31 es un entero largo. Esto es así porque los enteros normales se codifican en complemento a 2 de 32 bits, y 2**31 no puede representarse en complemento a 2 de 32 bits

Si bien los enteros largos resultan cómodos por no producir nunca errores de desbordamiento, debes tener presente que son muy ineficientes: ocupan mucha más memoria que los enteros normales y operar con ellos resulta mucho más lento.
Bueno también hablaremos de otros operadores, recuerdas que hemos visto los operadores suma, resta, multiplicación, división, modulo, elevación, etc, además de los operadores lógicos o booleanos, hoy te voy a presentar otros ya que en Python existe una variedad elevada, que en el transcurso de este blog se irán presentando.
Hay operadores que están dirigidos a manejar la secuencia de bits que codifican los números enteros.
El operador binario & calcula la operación “y” bit a bit.
El operador binario  |  calcula la operación “o” bit a bit
El operador binario  ^ calcula la operación “o exclusiva”, la diferencia con la anterior es que la “o exclusiva” devuelve True si y sólo si los dos operandos son falsos.
El operador unario ~ invierte los bits de su operando.
Tienes además, los operandos binarios <<, >> , que desplazan los bits a izquierda o derecha tantas posiciones como se las indiques. Aquí una serie de ejemplos que ayudaran a entender estos operadores
Aun no te queda claro porque esos resultados, aquí una breve explicación
Para el primer ejemplo 5&12, nos da 4, porque??
En binario tenemos la expresión 5 que equivale (00000101) y la expresión 4 que equivale (00001100) si tenemos 5&12 entonces tenemos 00000101 & 00001100, que nos da como resultado 00000100, que equivale a 4.
La expresión nosotros la damos en números naturales pero se ejecuta como si fueran números binarios, el resultado también se muestra como en numero natural.
Bien será entendiste el ejemplo, pero no sabes aun como se pasa un numero binario a decimal o viceversa.
Extraje un ejemplo del portal wikipedia en su sección números binarios, espero te quede claro.
Decimal a binario 
Se divide el número decimal entre 2 cuyo resultado entero se vuelve a dividir entre 2 y así sucesivamente. Una vez llegados al 1 indivisible se cuentan el último cociente, es decir el uno final (todo número binario excepto el 0 empieza por uno), seguido de los residuos de las divisiones subsiguientes. Del más reciente hasta el primero que resultó. Este número será el binario que buscamos. A continuación se puede ver un ejemplo con el número decimal 100 pasado a binario.
100 |_2
 0   50 |_2
      0  25 |_2         –> 100   1100100
          1  12 |_2
              0  6 |_2
                 0  3 |_2
                      1 1
Otra forma de conversión consiste en un método parecido a la factorización en números primos. Es relativamente fácil dividir cualquier número entre 2. Este método consiste también en divisiones sucesivas. Dependiendo de si el número es par o impar, colocaremos un cero o un uno en la columna de la derecha. Si es impar, le restaremos uno y seguiremos dividiendo por dos, hasta llegar a 1. Después sólo nos queda tomar el último resultado de la columna izquierda (que siempre será 1) y todos los de la columna de la derecha y ordenar los dígitos de abajo a arriba. Y luego se haría un cuadro con las potencias con el resultado.
Ejemplo:
100|0
 50|0
 25|1   –> 1, 25-1=24 y seguimos dividiendo por 2
 12|0
  6|0
  3|1
  1|1   –> 100   1100100
Existe un último método denominado de distribución. Consiste en distribuir los unos necesarios entre las potencias sucesivas de 2 de modo que su suma resulte ser el número decimal a convertir. Sea por ejemplo el número 151, para el que se necesitarán las 8 primeras potencias de 2, ya que la siguiente, 28=256, es superior al número a convertir. Se comienza poniendo un 1 en 128, por lo que aún faltarán 23, 151-128=23, para llegar al 151. Este valor se conseguirá distribuyendo unos entre las potencias cuya suma den el resultado buscado y poniendo ceros en el resto. En el ejemplo resultan ser las potencias 4, 2, 1 y 0, esto es, 16, 4, 2 y 1, respectivamente.
Ejemplo:
  20=   1|1
  21=   2|1
  22=   4|1
  23=   8|0
  24=  16|1
  25=  32|0
  26=  64|0
  27= 128|1           128+16+4+2+1=151   10010111
Espero halla quedado claro, cualquier duda en comentarios, lo que iba a ser un post breve se convirtió en un gran post, nos vemos, saludos y gracias por sus comentarios.
Nota: Extracto del libro Introducci 
  1. Guilty
    julio 20, 2008 a las 12:44 am

    Hola Crizur
    La lección de hoy estuvo buena, pero tengo una duda y es
    que quisiera saber qué significa complemento a 2 de 32 bits.
    Gracias de antemano.

  2. julio 20, 2008 a las 1:30 am

    Hola Guilty gracias por poster, bueno aqui te resuelvo tu duda, espero quedes más claro.
    Un campo de almacenamiento de 32 bits permite 2^32 combinaciones posibles. Debido a esto, el rango de valores naturales que pueden ser almacenados en 32 bits es de 0 hasta 4.294.967.295 (que es 2^32 − 1). Para enteros con signo, utilizando el complemento a dos, el rango es desde −2.147.483.648 ( − 2^32 *1^-1) hasta +2.147.483.647 ((2^32 )*(1^-1) − 1).
    Entonces 2**31 queda fuera de este rango, por eso es entero largo, adios

  3. Guilty
    julio 20, 2008 a las 1:37 am

    Me despejaste la duda, ahora si esta todo claro, gracias

  4. julio 20, 2008 a las 1:58 am

    Me alegro Guilty, y sigue visitando el blog, saludos

  5. netcie.blogspott.com
    enero 23, 2013 a las 11:42 pm

    bueno ante todos quisiera dejar una duda con la negacion (~), se dice que es bit a bit, pero he observado que python lo unico que ace es sumar uno al numero dado y ponerle negativo por ejm. si le doy: ~2=-3, ~3=-4, ~43=-44.bueno si observamos por ejemplo 2 es 10 si hacemos ~10=01=1, 3 es 11 si hacemos ~11=0 entoncs donde que da la logica de python otra cosa que he notado es que no respeta las reglas de la logica en cuanto al desplazamient…bueno espero su respuesta quisiera una aclaracion pues no me queda muy claro

  6. mayo 18, 2013 a las 2:48 pm

    What are the Advantages of Unsecured Personal unsecured bad credit loanss Advantages of Unsecured Personal unsecured
    bad credit loanssDisadvantages of Unsecured Person
    unsecured bad credit loanssHow Is A Personal Unnsecured unsecured bad credit loans
    Different Than Other unsecured bad credit loanss?

  7. agosto 10, 2013 a las 2:29 pm

    genial… solo una pregunta, cuando haces por ejemplo 5 & 7, que operacion se hace en si una suma, division o que ???

    • dadlink
      octubre 6, 2013 a las 10:12 pm

      creo q al mayor le resta el menor… en forma binaria, de ahi el resultado del ejemplo que puso.

  8. abril 3, 2015 a las 9:18 pm

    es una clase formidable y todos los que leen el escrito tuyo lo van a gradecer por la buena explicacion gracias Cristian

  1. octubre 2, 2013 a las 3:18 pm
  2. julio 31, 2015 a las 9:41 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: