IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Passer un binaire negatif en decimal


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 44
    Par défaut Passer un binaire negatif en decimal
    Bonjour,
    comment passer un binaire negatif en decimal:

    Integer i = Integer.valueOf("11111111111111111111111111100111", 2);

    me donne
    Exception in thread "main" java.lang.NumberFormatException: For input string: "11111111111111111111111111100111"

    Comment faire ??????????
    Merci de votre aide
    (et merci pour les reponses aux questions precedentes!)

  2. #2
    Membre expérimenté
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Par défaut
    Slt
    java.lang.NumberFormatException
    Cela signifie que ton nombre est trop grand pour rentrer dans un Integer
    Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Long l = Long.valueOf("11111111111111111111111111100111", 2);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 44
    Par défaut long is no good!!!
    Avec un Long
    Long l = Long.valueOf ("11111111111111111111111111100111", 2);
    j'ai
    l...: 4294967271

    Alors que au depart
    Integer f = -25;
    System.out.println( "-25..:"+f.toBinaryString(f));-25..:
    me donne
    -25..:11111111111111111111111111100111

    Comment retrouver -25 a partir de sa valeur binaire????

    Merci!

  4. #4
    Membre expérimenté
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Par défaut
    En fait en regardant la javadoc on se rend compte que si l'on veut parser un nombre signé, il faut mettre un "-" devant

    Si tu parse des nombres signés de 32 bits, alors tu peux faire

    Si c'est un nombre positif, faire Integer.parseInt() classique
    Sinon, tu peux utiliser cette astuce : supprimer le bit de signe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		Integer i = Integer.valueOf("1111111111111111111111111100111", 2);
    		System.out.println(-(Integer.MIN_VALUE-i));
    Il y a surement mieux mais j'ai pas d'autres solution à proposer a chaud

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 44
    Par défaut je ne sais pas si le nombre est positif ou negatif!
    Le pb c'est que je ne sais pas si le nombre est positif ou negatif!
    Je n'ai qu'un assemblage de Bits que je doit decommute pour avoir la valeur decimale.
    Si qqu'un a une idee..ca m'arrangerait ce chez arrangerait
    Merci

  6. #6
    Membre expérimenté
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Par défaut
    Si tu as 32 bits, ton nombre est positif si le bit de gauche est à 0
    Si tu as 32 bits, ton nombre est negatif si le bit de gauche est à 1
    Si tu as - de 32 bits, alors je pense qu'on peut en deduire que ton nombre est positif (si c'est un int, pas un short )

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 44
    Par défaut c'est pas bon...désolé!
    Je prend une chaine hexa "07FF" du bit 9 au bit 15, que je met dans un String
    Je prend une autre chaine hexa "FFE7" du bit 0 au bit 15, que je met dans un autre String
    Je concatene les 2 strings

    Ma longueur de chaine n'est pas 32
    Comment savoir si sa valeur est negative
    Comment retrouver sa vraie valeur
    J'angoisse là!!!

    Merci pour tout..

  8. #8
    Membre expérimenté
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Par défaut
    Quel nombre attend tu exactement pour cette valeur Hexa ("FFE707FF") ?
    Je trouve -1636353 avec ma précédante méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	int i=Integer.parseInt("7FE707FF",16);
    	System.out.println(-(Integer.MIN_VALUE-i));
    Toujours pareil, comme ta chaine commence par un 8 à F, elle est négative, donc tu soustrait ce bit en retirant 8 au premier caractère, puis tu applique la meme méthode...

    Bref comme personne d autre ne poste je doute qu il y est plus simple

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Panneau Voir le message
    Alors que au depart
    Integer f = -25;
    System.out.println( "-25..:"+f.toBinaryString(f));-25..:
    me donne
    -25..:11111111111111111111111111100111
    Mais pas si tu utilises Integer.toString(-25,0x10)...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 44
    Par défaut concatenation variee
    "07FF" du bit 9 au bit 115 me donne 1111111
    FFE7 du bit 0 au bit 15 me donne 1111111111100111
    Je concatene et j'obtiens
    111111111111111111111100111
    ce qui me donne
    -2080374809

    Alors que je voudrais avoir
    11111111111111111111111111100111 qui me donnerait -25 et qui corespond a la valeur exacte

    Pour ce cas je pourrais rajouter des 1 et avoir ma valeur..mais cette methode ne serait pas generique et ne marcherait pas pour d'autre concatenation..

    Merci pour votre patience

  11. #11
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class TestBinary {
     
    	public static void main(String[] args) {
    		String negToBinaryString = Integer.toBinaryString(-2025);
    		String posToBinaryString = Integer.toBinaryString(2025);
    		String negToString = Integer.toString(-2025, 2);
    		String posToString = Integer.toString(2025, 2);
     
    		System.out.println("toBinaryString(2025) : " + posToBinaryString);
    		System.out.println("toBinaryString(-2025): " + negToBinaryString);
     
    		System.out.println("toString(2025,2)     : " + posToString);
    		System.out.println("toString(-2025,2)    : " + negToString);
     
    		int toStringDecoded = Integer.parseInt(negToString,2);
     
    		int result = 0;
    		for (char c : negToBinaryString.toCharArray()) {
    			int bit = c - '0';
    			result = (result << 1) + bit;
    		}
    		int toBinaryStringDecoded = result;
     
    		System.out.println("toString(-2025,2) decoded    : " + toStringDecoded);
    		System.out.println("toBinaryString(-2025) decoded: " + toBinaryStringDecoded);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    toBinaryString(2025) : 11111101001
    toBinaryString(-2025): 11111111111111111111100000010111
    toString(2025,2)     : 11111101001
    toString(-2025,2)    : -11111101001
    toString(-2025,2) decoded    : -2025
    toBinaryString(-2025) decoded: -2025

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 44
    Par défaut J'y arrive pas!
    J'ai fais ceci:

    String hexa = "07FF";
    Integer lg1 = Integer.parseInt(hexa, 16);
    String hexaBin1 = lg1.toBinaryString(lg1);
    System.out.println("hexaBin1....: " + hexaBin1);
    hexaBin1....: 11111111111

    // si la chaine fait pas 16 caracteres(16 bits)
    if (hexaBin1.length() < 16) {
    String tmp = "";
    // si le 1er bit = 1 alors ne nombre est negatif
    if (hexaBin1.charAt(0) == '1') {
    for (int i = hexaBin1.length(); i < 16; i++) {
    tmp = tmp.concat("1");
    }
    }
    hexaBin1 = hexaBin1 + tmp;
    System.out.println("hexaBin1....: " + hexaBin1);
    hexaBin1....: 1111111111111111
    }

    hexa = "FFE7";
    Integer lg2 = Integer.parseInt(hexa, 16);
    System.out.println("lg2....: " + lg2.toBinaryString(lg2));
    lg2....: 1111111111100111

    String binString = hexaBin1 + Integer.toBinaryString(lg2);
    System.out.println("binString....: " + binString);
    binString....: 11111111111111111111111111100111

    Long x = Long.parseLong(binString, 2);
    System.out.println("x....: " + x);
    x....: 4294967271

    Integer y = Integer.parseInt(binString, 2);
    System.out.println("y....: " + y);
    Exception in thread "main" java.lang.NumberFormatException: For input string: "11111111111111111111111111100111"



    L'exception est normale (cf doc), mais toujours est t'il que je devrais trouver
    -25 comme valeur et que je n'y arrive pas!
    (Cette valeur -25, m'est donne par un prog Fortran que je suis entrain de traduire...)

    Le probleme vient du fait que la premiere variable Hexa commence par un 0 et donc en binaryString est sur 12 caracteres...
    Voila, 2jours la dessus... ca va bientot etre ma fete!!!
    Merci pour tout

  13. #13
    Membre expérimenté
    Avatar de vahid
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 228
    Par défaut
    Soyons clair :
    Tu n'arrivera jamais a utiliser Interger.parseInt sur une string de longueur 32.
    La raison est simple : le bit de gauche n'est PAS interprété comme bit de signe, donc il prend un bit de trop en compte.

    La bidouille que je t'ai donné auparavant ne marche pas ? (supprimer le bit de signe et faire la manip)

  14. #14
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    salut,
    tu peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		long l = Long.valueOf("11111111111111111111111111100111", 2);
    		int a = (int)l;
    		System.out.println(a);
    		System.out.println(l);
    et

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/05/2011, 12h59
  2. Type de donnée chiffre negatif avec decimal
    Par Midsou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/05/2010, 10h30
  3. [Binaire] Conversion decimal -> binaire sans vecteur
    Par yann1979 dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2005, 17h10
  4. [Normalisation] Passer de ternaire a binaire et quel interet ?
    Par chateau_dur dans le forum Schéma
    Réponses: 2
    Dernier message: 17/10/2005, 23h57
  5. [ABAP] Convertir nombre decimal en binaire
    Par danael dans le forum SAP
    Réponses: 3
    Dernier message: 04/04/2005, 13h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo