(sin asunto)

Chema Cortes pych3m4 en gmail.com
Sab Oct 21 05:04:27 CEST 2006


Estoy de acuerdo contigo que no se debería ayudar a quien demuestra
que no se ha esforzado nada. De todos modos, quisiera comentarte
algunas mejoras de tu código:

El 2006/10/20, Christian Huelmo <chuelmo en montevideo.com.uy> escribió:

> Muy rapidito y sin control de errores me quedó esto:
>
> def dec2bin(decimal):
>         binario = []
>         while decimal > 1:
>                 binario.append(decimal % 2)
>                 decimal /= 2
>         binario.append(decimal)
>         return binario
>
> p = dec2bin(33)
> p.reverse()
> print p   -->  [1, 0, 0, 0, 0, 1]

En python tenemos operaciones en binario que pueden aprovecharse:

def dec2bin(n):
  b=[]
  while n:
    n,r=n>>1,n&1
    b.insert(0,r)
  return b

De modo similar, pero usando la función 'divmod':

def dec2bin(n):
  b=[]
  while n:
    n,r=divmod(n,2)
    b.insert(0,r)
  return b


Todavía más elegante, si cabe, son las versiones recursivas:

def dec2bin(n):
  if n>1:
    return dec2bin(n>>1)+[n&1]
  else:
    return [n]

def dec2bin(n):
  if n>1:
    n,r=divmod(n,2)
    return dec2bin(n)+[r]
  else:
    return [n]

Con unos pocos cambios, también serviría para octal y hexadecimal:

def dec2oct(n):
  if n:
    return dec2oct(n>>3)+[n&7]
  else:
    return []

También se podría hacer una versión genérica (con clausura):

def dec2bin(n,pos=1):
  mask=2**pos-1
  def _dec2bin(n):
    if n:
      return _dec2bin(n>>pos)+[n&mask]
    else:
      return []
  return _dec2bin(n)

from functools import partial  #python 2.5
dec2oct=partial(dec2bin,pos=3)
dec2hex=partial(dec2bin,pos=4)

Como curiosidad, una versión publicada en esta misma lista hace tres años:

def dec2bin(n):
  oct2binl=["000","001","010","011","100","101","110","111"]
  return "".join([l[int(c)] for c in "%o"%n])


La misma cosa, pero en sólo una línea ("inliner"):

dec2bin=lambda x: "".join([
   ["000","001","010","011","100","101","110","111"][int(c)]
   for c in "%o"%long(x)] )


En fin, seguro que hay más formas. Sólo es cuestión de ponerse a pensar un rato.




Más información sobre la lista de distribución Python-es