Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 15-03-2016 15:54:59

fahdi07
Membre
Inscription : 15-03-2016
Messages : 1

Calculs Binaire

Slt

Suis debutant dans le monde de la programmation et j'aurais besoin de votre aide en ce qui concerne les calculs Binaire.
Tout d'abord comment transformer les bases 10 en base 2 et et vice-versa.
genre on me donne un nombre comme ce-ci :
2016 que je dois transformer en base 2. comment proceder?

mrc d'avance

Hors ligne

#2 15-03-2016 21:35:14

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : Calculs Binaire

Bonsoir,

Rapidement, écrire un nombre en base 10, c'est faire des paquets de dix, puis de dix fois dix, puis...etc...
L'écrire en base deux c'est faire des paquets de deux, puis de deux fois deux, puis...etc...
(Désolé, je viens de passer 5 h aux Urgences où j'ai emmené ma mère, je suis un peu cuit ce soir
A la main :
2016 | 2
     0 |---
       |1008 | 2
             0   |---
                  | 504 | 2
                        0 |---
                           | 252 |  2
                                 0 |------
                                   |   126 | 2
                                           0 |-----
                                              |  63  |  2
                                                    1 |---
                                                       | 31 | 2
                                                           1 |---
                                                              | 15 | 2
                                                                  1 |---
                                                                     | 7  | 2
                                                                        1 |---
                                                                           | 3  | 2
                                                                              1  |---
                                                                                  | 1 --> ET là, tu tiens ton test d'arrêt

Tu as besoin d'une boucle While (TANT_QUE avec AlgoBox)
Il te faut partir du nombre 2016
Faire les divisions successives par 2.
stocker le reste et le quotient entier dans deux variables distinctes à chaque itération
disposer d'un compteur qui démarre à 0  par exemple appelé cpt...
Tu as besoin d'une variable pour construire ton nombre par ex nb_converti.
Pour juxtaposer les restes dans le bon ordre, il faut les écrire l'un à côté de l'autre, soit à chaque tour, mettre dans nb_converti son ancienne valeur à qui on ajoute le reste obtenu multiplié par [tex]10^{cpt}[/tex]
Et on incrémente le compteur de 1 :cpt=cpt+1
La boucle While +condition est
While q >1 (TANT QUE q >1 FAIRE ce qui suit)
A la sortie de ta boucle, si justement tu en es sorti c'est que q=1
Il te reste donc un dernier calcul qui s'écrit
[tex]nb\_converti=nb\_converti+q\times 10^{cpt}[/tex]

Là, je peux plus, je reprends demain en Python et avec AlgoBox.

Quel langage veux-tu utiliser ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 16-03-2016 11:06:01

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 944

Re : Calculs Binaire

Bonjour,

Voilà de la programmation basique en Python :

# usr/bin/env python
# -*- coding: utf8 -*-

nb_depart=215
base = 2
nb_converti=0
cpt=0
q,r=nb_depart,0
while q>base-1:
    q,r=q//base,q%base
    nb_converti=nb_converti+r*10**cpt
    cpt=cpt+1
nb_converti=nb_converti+q*10**cpt

print ("nombre converti :",nb_converti)

Qui me donne en sortie :

nombre converti : 11010111

En replaçant 215 par 20015 :

nombre converti : 100111000101111

Le même code écrit avec AlgoBox :

VARIABLES
    nb_converti EST_DU_TYPE NOMBRE
    base EST_DU_TYPE NOMBRE
    cpt EST_DU_TYPE NOMBRE
    q EST_DU_TYPE NOMBRE
    r EST_DU_TYPE NOMBRE
    nb_depart EST_DU_TYPE NOMBRE
DEBUT_ALGORITHME
     nb_converti PREND_LA_VALEUR 0
     base PREND_LA_VALEUR 2
     cpt PREND_LA_VALEUR 0
     nb_depart PREND_LA_VALEUR 215
     q PREND_LA_VALEUR nb_depart
     r PREND_LA_VALEUR 0
    TANT_QUE (q>base-1) FAIRE
        DEBUT_TANT_QUE
        r PREND_LA_VALEUR q%base
        q PREND_LA_VALEUR floor(q/base)
        nb_converti PREND_LA_VALEUR nb_converti+r*pow(10,cpt)
        cpt PREND_LA_VALEUR cpt+1
        FIN_TANT_QUE
    nb_converti PREND_LA_VALEUR nb_converti+q*pow(10,cpt)
    AFFICHER "Le nombre converti est : "
    AFFICHER nb_converti
FIN_ALGORITHME

AlgoBox est un langage basique proche du pseudo-code : il ne connaît pas pas par exemple le quotient entier : je suis obligé de prendre la partie entière du quotient calculé.

En Python, je dispose déjà (écrit, il y a un certain temps) d'un code bien plus évolué  qui convertit n'importe quel entier d'une base X vers une base Y, X et y étant compris entre 2 et 36 inclus.

# usr/bin/env python
# -*- coding: utf8 -*-

from math import log
from time import clock


def choixbase(es,b1):
    # Cette même fonction sert pour les deux bases.
    ok,supp=0,"de départd'arrivée"
    while not ok:
        bs=input("Entrer la base "+supp[es:es+9]+" (entre 2 et 36) : ")
        try:
            bsn=int(bs)
            if bsn<2 or bsn>36:
                print ("Désolé, valeur hors limite. Veuillez recommencer S.V.P.\n")
            else:
                if es==9 and bsn==b1:
                   print ("Désolé, Les bases sont les mêmes. Veuillez recommencer S.V.P.\n")
                else:
                    ok=1          
        except ValueError:
            print ("Désolé, ceci n'est pas un nombre. Veuillez recommencer S.V.P.\n")
    return bsn
                     
def choixdunombre(b):
    ok=0
    while not ok:
        nb=input("Entrer le nombre à convertir : ").upper()
        chfr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[:b]
        for car in nb:
            if car not in chfr:
                print ('Désolé, '+car+' n\'existe pas en base '+str(b)+'. Veuillez recommencer, S.V.P\n')
                break
            else:
                ok=1
    return nb

def versdix(s,b):
    l,nb,s=len(s),0,s[::-1]
    chfr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    for i in range(l):      
        nb+=chfr.find(s[i])*b**i
    return nb

def versbase(nbcr,b):
    nb,nbdiv='',int(log(nbcr)//log(b))+1
    chfr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    for i in range(nbdiv):
        nbcr,r=nbcr//b,nbcr%b
        nb=chfr[r]+nb
    return nb                    

print ("         ******************************************")
print ("         *         Conversion d'un nombre         *")
print ("         *      d'une base X vers une base Y      *")
print ("         ******************************************\n\n")

base_depart=choixbase(0,0)
nb=choixdunombre(base_depart)
base_arrivee=choixbase(9,base_depart)


# Affichage des données
print('\n Le nombre')
print ('    '+nb)
print (' écrit en base',base_depart)

tp_d=clock()
# Calculs
if base_depart!=10:
    nb_converti=versdix(nb,base_depart)
else:
    nb_converti=int(nb)
if base_arrivee !=10:
    reponse=versbase(nb_converti,base_arrivee)
else:
    reponse=str(nb_converti)  

#Affichage de la réponse et du temps de calcul
print ('\n s\'écrit')
print ('    '+reponse)
print (' en base '+str(base_arrivee))

print ('\nDurée du calcul :',clock()-tp_d,"s")

 

Exemple de sortie :


         ******************************************
         *         Conversion d'un nombre         *
         *      d'une base X vers une base Y      *
         ******************************************


Entrer la base de départ (entre 2 et 36) : 10
Entrer le nombre à convertir : 204037
Entrer la base d'arrivée (entre 2 et 36) : 16

 Le nombre
    204037
 écrit en base 10

 s'écrit
    31D05
 en base 16

Durée du calcul : 0.008870959856629824 s

Explications sur demande.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Pied de page des forums