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

Java Discussion :

Entiers 32 bits et chaines binaires


Sujet :

Java

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Entiers 32 bits et chaines binaires
    Hello,

    J'ai un problème assez étrange qui montre certainement que je n'ai pas assez écouté mes cours d'info de base.

    Partant du fait que les entiers sont codés sur 32 bits, je me demande pourquoi certaines valeurs ne sont pas convertibles par java ? Prenons le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int i = Integer.MIN_VALUE ;
    String bin = Integer.toBinaryString(i);
     
    System.out.println(bin.length()); // 32
     
    int ii = Integer.parseInt(bin, 2);
    Une java.lang.NumberFormatException est lancée à la dernière ligne, alors que l'entrée binaire provient de Integer.toBinaryString().

    En d'autres termes il est capable de convertir la valeur maximale des entiers en chaine binaire, mais il n'est pas capable de faire alors la conversion inverse... et cela me perturbe fortement. D'autant plus que mon problème initial est de transformer des chaines binaires en plusieurs entiers de 32 bits, et que je ne vois pas comment je vais faire du coup...

    Si quelqu'un pouvait m'éclairer
    Merci d'avance!

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    toBinaryString réalise une conversion non signée :
    Integer.MIN_VALUE + 2^32 = -2^31 + 2^32 = 2^31
    qui est égal à Integer.MAX_VALUE + 1, d'où l'exception si tu réalises la conversion inverse.
    Il faut converser le signe lors de la 1ère conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String bin = (i < 0 ? "-" : "") + Integer.toBinaryString(i);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 54
    Points : 59
    Points
    59
    Par défaut
    Bonjour,

    C'est à cause de l'utilisation de la méthode toBinaryString, qui retourne un entier non signé ! Je te mets le lien de la javadoc ici.

    Si tu utilises la méthode toString(i, 2), ton code marchera. Ou que tu préfixes la variable bin par la caractère -

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    En effet... comme quoi il faut bien lire la doc

    Mais du coup, si je ne dispose que d'une chaine de 32 bits et que je ne connais pas à l'avance la valeur de l'entier correspondant (et donc son signe), comment faire la conversion binaire -> entier signé puisque Integer.parseInt() ne fonctionnera pas sur une chaine binaire représentant un nombre négatif ?

    Comme ca je vois une solution du type (en supposant que binStr est une chaine de 32 bits!):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(binStr.charAt(0) == '1') { // Entier negatif
        binStr = not(binStr) ;
        i = - (int) Long.parseLong(binStr, 2);
    }
    else {  // Entier positif
        i = (int) Long.parseLong(binStr, 2);
    }
    mais bon, ca fait bricolage...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 54
    Points : 59
    Points
    59
    Par défaut
    Au lieu d'utiliser toBinaryString, tu peux utilser toString(i, 2), et là ta chaîne de caractères sera préfixée du '-'.

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    @glebreton: si je ne dispose pas de i, mais uniquement de sa représentation en binaire 32 bits, ca n'est pas possible.

    Correction sur le code précédent, la solution serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(binStr.charAt(0) == '1') {
        i = Integer.parseInt("-"+binStr, 2);
    }
    else {
        i = Integer.parseInt(binStr, 2);
    }

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Par exemple, oui. Ou alors, vérifier qu'il y a bien 32 chiffres et utiliser Long.parseLong(). Ou alors, juste parser soi-même. Des zéros et des uns, bon...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Conversion de binaires en tableau d'entiers 16 bits
    Par Donnie Darcko dans le forum Débuter
    Réponses: 4
    Dernier message: 24/03/2008, 13h29
  2. [TP] Entier 32 bits non signé
    Par SkaMan dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 24/08/2005, 22h17
  3. Entier : accès bit à bit
    Par slylafone dans le forum C++Builder
    Réponses: 16
    Dernier message: 14/06/2005, 20h34
  4. Entier 64 bits sous linux, problème d'affectation
    Par Steki-kun dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2005, 21h10
  5. convertion d'une chaine binaire
    Par Mister dans le forum C
    Réponses: 3
    Dernier message: 03/10/2003, 22h39

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