Binaire vers décimal Python

Salut,

Je veux coder une fonction dans Sage qui prend une liste (de 0 et 1) en entrée et retourne le nombre en décimal.

Voici mon code
def BinDec (b) :

    n=0

    for i in range (len(b)):

        n=n+b[len(b)-(i+1)]*(2^i) 

    return n

Mathématiquement ça doit être bon (j'espère), sauf que quand je teste sur n'importe quelle liste ça me renvoie... 1!

BinDec([1,0,1]) = 1...

Je ne comprends pas absolument pas pourquoi...

Si quelqu'un peut m'aider, merci !

Réponses

  • Bonsoir,

    En Python, et Sage fait du python $0b11111100001$ donne $2017$.

    Cordialement,

    Rescassol
  • L’opérateur de puissance est ** en Python, pas ^.

    Sinon, int("".join(map(str,b)),2) devrait fonctionner.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • "Sage fait du Python" c'est vite dit... C'est une surcouche de Python qui ne fait pas tout à fait du Python. Tous les entiers du code sont par exemples remplacés par des "entiers Sage".

    En particulier, Sage est aussi sensé transformer ^ en ** sur les entiers (le ^ en Python entre les entiers correspond au "et bit à bit" et non à la puissance). Le code que tu as posté ici Grayford doit normalement fonctionner sous Sage mais pas sous Python.
  • sebsheep a écrit:
    le ^ en Python entre les entiers correspond au "et bit à bit"
    Non, c'est un xor bit à bit. Le et bit à bit est &.
  • Merci, pour les réponses mais le ^ ou le ** ne marchent pas.
    Je précise : je suis bien avec Sage, désolé si cela vous a gêné mais je pensais que Python était ce que Sage utilisait (entre autre).

    Et ma fonction prend en entrée une liste (c'est imposé par une autre fonction), je ne peux donc pas convertir directement avec int("".join(map(str,b)),2) (si j'ai bien compris...)

    Quant à 0b11110001, c'est 0b la fonction ?

    Quelqu'un peut-il copier-coller voir si cela vient de chez moi ?

    Merci.
  • Il serait plus élégant d'appliquer l'algorithme de Horner pour évaluer en 2 la liste des entiers vus comme coefficients d'un polynôme.
  • Je confirme, l’algorithme de Horner marche très bien.
    Cela dit, tu peux coder ta fonction ainsi :
    def BinDec(b):
      return int("".join(map(str,b)),2)
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
Connectez-vous ou Inscrivez-vous pour répondre.