Somme nombre binaire

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 880 fois - Téléchargée 15 fois

Contenu du snippet

Cette classe a pour but de convertir un nombre de la base 10 à la base 2, tout en fixant le radix qui est le nombre de bit avec lequel le nombre dans la base 2 vas être affiché....
pour application, on va calculer la somme de deux nombres au choix ....

Source / Exemple :


import java.math.*;
import java.util.*;
import java.lang.*;
/**
 *

  • @author scupper
  • @since Fri Feb 25 , At: 1:02
  • /
public class NombreBaseBinaire { private int radix = 0; public void setRadix(int radix){ this.radix = radix; } public int max(int a , int b){ return (a>b)?a:b; } public int min(int a , int b){ return (a>b)?b:a; } public Vector setRadix(Vector V,int radix){ Vector VV = new Vector(); int diff; if((diff =this.radix-V.size())>0){ for(int i=0;i<diff;i++){ VV.add(0); } for(int i=diff;i<this.radix;i++){ VV.add(V.get(i-diff)); } }else{ VV = V; } return VV; } public Vector intToBinaire(int n){ Vector v = new Vector(); Vector V = new Vector(); Vector VV = new Vector(); int iteration=0; int diff; //Division euclidienne dans la base 2 et insertion dans un vecteur while(n>0){ v.add(iteration, n%2); n/=2; iteration++; } //on inverse l'ordre des éléments du vecteur précédents pour avoir n en base 2 for(int i=0;i<v.size();i++){ V.add(v.get(v.size()-i-1)); } /**
  • Début du formatage en N bits qui est Définis par N = radix
  • /
if((diff =this.radix-V.size())>0){ for(int i=0;i<diff;i++){ VV.add(0); } for(int i=diff;i<this.radix;i++){ VV.add(V.get(i-diff)); } }else{ VV = V; } /**
  • Fin du formatage
  • /
return VV; } public Vector sommeBinaire(Vector v,Vector w){ Vector x = new Vector(); Vector V = new Vector(); Vector W = new Vector(); Vector X = new Vector(); boolean Rin = false , Sig ,a , b; int radix = max(v.size(),w.size()); setRadix(v,radix); setRadix(w,radix); //on inverse l'ordre des éléments des vecteurs for(int i=0;i<v.size();i++){ V.add(v.get(v.size()-i-1)); W.add(w.get(w.size()-i-1)); } /**
  • soit Sig la somme et Rin la retenue d'entrée et Rout la retenue en sortie de l'additionneur
  • on a :
  • Sig = a xor b xor Rin
  • Rout = [Rin and (a xor b)] or (a and b)
  • /
for(int i=0;i<radix;i++){ if(Integer.parseInt(V.get(i).toString())==1)a = true; else a = false; if(Integer.parseInt(W.get(i).toString())==1)b = true; else b = false; Sig = (a ^ b) ^ Rin; Rin = (Rin & (a ^ b)) | (a & b); System.out.println("a = "+a+" b = "+b+" Sig = "+Sig +" Rin = " +Rin); if(Sig==true) x.add(1); else x.add(0); } //on inverse l'ordre des éléments du vecteur for(int i=0;i<v.size();i++){ X.add(x.get(x.size()-i-1)); } setRadix(X, radix); return X; } public static void main(String[] args){ NombreBaseBinaire obj = new NombreBaseBinaire(); Vector v ; obj.setRadix(16); v = obj.intToBinaire(243); Vector w ; obj.setRadix(16); w = obj.intToBinaire(26); Vector x = obj.sommeBinaire(v, w); System.out.print(" "); for(int i=0;i<v.size();i++){ System.out.print(v.get(i)); } System.out.println(); System.out.println(" + "); System.out.print(" "); for(int i=0;i<v.size();i++){ System.out.print(w.get(i)); } System.out.println(); System.out.println(" ---------------------- "); System.out.print(" = "); for(int i=0;i<v.size();i++){ System.out.print(x.get(i)); } System.out.println(); } }

Conclusion :


Comme sortie du programme on aurait :

run:
0000000011101010
+
0000000000011011
----------------------
= 0000000011110001
BUILD SUCCESSFUL (total time: 0 seconds)

A voir également

Ajouter un commentaire Commentaires
Messages postés
28
Date d'inscription
jeudi 15 octobre 2009
Statut
Membre
Dernière intervention
12 décembre 2013

@Menuki : C fait :D !!
Messages postés
13
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
11 août 2008

Bonjour,

Il n'y aurait pas comme une erreur?
Tu n'oublierais pas la retenue?
Je m'explique : tu rajoutes un 0 dans le résultat si les deux bits sont égaux et un 1 s'ils sont différents.
En effet 0+0 = 0, 0+1=1, 1+0=1.
Mais 1+1 = 10! Ca donne bien 0 mais modulo 2, il faut rajouter la retenue au chiffre suivant.

Reprenons ton exemple :
0000000011101010
+
0000000000011011
----------------------
= 0000000100000101

Et oui, 234 + 27 = 261 et pas 241!

Vérifier ses résultats, c'est la base!
Messages postés
28
Date d'inscription
jeudi 15 octobre 2009
Statut
Membre
Dernière intervention
12 décembre 2013

David, regarde le code suivant est une interface graphique que tu pourrait changer à ta guise ...
Le code est tel que tu entre deux texte et dans la section TexteField il te montre la valeur :
texte1 + texte2 une fois tu clique sur le boutton somme ...
Si tu es intérréssé par ce code je pourrais le modifier de telle façon il suit le code audessus, mais je crois que maintenant tu peux le modifier comme tu veux :D

import java.awt.*;
import java.awt.event.*;
import java.awt.color.*;
import java.awt.font.*;
import java.awt.image.*;

/**
*
* @author scupper
*
*/
public class DefaultInterface extends Frame implements ActionListener {

private final int radix = 32;

TextField tf1=new TextField(radix),
tf2=new TextField(radix),
tf=new TextField(radix);

Button ok = new Button("Sommer ...");
Panel p1,p2;
Canvas c[] = new Canvas[2];

public DefaultInterface(String title){
super(title);


for(int i =0;i<2;i++){
c[i] = new Canvas();
}
p1 = new Panel();
p2 = new Panel();
GridLayout gl1 = new GridLayout(4,1,10,10);
GridLayout gl2 = new GridLayout(1,4,10,0);

p2.setLayout(gl2);
p2.add(c[0]);
p2.add(ok);
p2.add(c[1]);
p1.setLayout(gl1);
p1.add(tf1);
p1.add(tf2);
p1.add(tf);
p1.add(p2);

tf1.setBackground(Color.white);
tf2.setBackground(Color.white);
tf.setBackground(Color.white);
tf.setEditable(false);

add(p1);
ok.addActionListener(this);

}

public static void main(String[] args){
DefaultInterface obj = new DefaultInterface("Testin' ...");
obj.setSize(200, 200);
obj.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent arg0) {
String texte1,texte2;
texte1=tf1.getText();
texte2=tf2.getText();
//Procedure de convertissage et de calcule
tf.setText(texte1+"+"+texte2);
}


}
Messages postés
28
Date d'inscription
jeudi 15 octobre 2009
Statut
Membre
Dernière intervention
12 décembre 2013

je vois , mais tu C ke pour moi l'interface graphique C pas vraiment intérréssant tu pourrait tjrs ou bi1 créer une frame ou bien une applet pour contenir deux TextField pour les deux nombres, une autre région TextFiled pour la somme et un Button de telle façon tu introduit sur le bouton un Listener et puis dans la méthode que tu devrait surchaG, tu introduis les fonctions de cette classe, ce que je trouvais intérréssant dans ce code c'était le fait que je pourrait maintenant faire la somme de nombre sur une longeur indéfini en utilisant le champ "radix", puisque on ne peut pas dépasser un nombre max même si on passe a Long, je sais pas si tu m'as compris mais c'est une classe que je prévoit d'utiliser dans le futur proche :D
Messages postés
23
Date d'inscription
lundi 31 décembre 2001
Statut
Membre
Dernière intervention
19 mai 2012

EN fait tu additionne deux chiffres et je voudrais les changer tu n'as pas fais une interface graphique ou tu peux entrer les chiffres que tu veux?
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.