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

VB.NET Discussion :

Nombre BigInteger vers binaire et inversement


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Aucune
    Inscrit en
    Mars 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Mars 2014
    Messages : 34
    Par défaut Nombre BigInteger vers binaire et inversement
    Salut, voici un code créer des mes propre main et sans aide, autant dire que j'en suis très fier car dès aujourd'hui, j'ai compris comment ça fonctionnais
    C'est super facile en faite !

    Le code fonctionne avec des BigInteger, comme ça, pas de soucis de débordement
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    Imports System.Numerics
     
    Module Module1
     
        Function Bin(ByVal Nombre As BigInteger)
     
            Dim Binaire As String = ""
            Dim NombreSortie As BigInteger = 0
     
            Do
     
                NombreSortie = Nombre / 2
                Binaire += (Nombre - (NombreSortie * 2)).ToString
                Nombre = NombreSortie
     
            Loop Until Nombre = 0
     
            Return StrReverse(Binaire)
     
        End Function
     
        Function BinVal(ByVal Bin As String)
     
            Dim NombreSortie As BigInteger = 0
            Dim Bite As String = ""
     
            If Bin > "" Then
     
                For Index = 1 To Bin.Length
     
                    Bite = Bin.Substring(Index - 1, 1)
     
                    If Bite = "0" Then
                        NombreSortie *= 2
     
                    ElseIf Bite = "1" Then
                        NombreSortie *= 2
                        NombreSortie += 1
                    End If
     
                Next
     
                Return NombreSortie
            Else
     
                Return ""
            End If
     
        End Function
     
        Sub Main()
     
            Dim NombreOriginale As BigInteger = BigInteger.Parse("1234567890123456789012345678901234567890")
            Dim NombreVersBinaire As String = Bin(NombreOriginale)
            Dim BinaireVersNombre As BigInteger = BinVal(NombreVersBinaire)
     
            Debug.WriteLine(NombreOriginale.ToString & " En Binaire = " & NombreVersBinaire)
            Debug.WriteLine(NombreVersBinaire & " Vers Nombre = " & BinaireVersNombre.ToString)
     
        End Sub
     
    End Module
    N'oubliez pas d'ajouter la référence System.Numerics à votre projet pour que ceci fonctionne !

  2. #2
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    Edit : je reprend la forme de mon commentaire qui passais pour condescendant.

    Félicitation pour ton programme, cela fait toujours plaisir de réussir quelque chose sur lequel on a passé du temps.

    Tu peux faire tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
                  int a = 254;
     
                Console.WriteLine("Binaire     : {0}", Convert.ToString(a,2));
                Console.WriteLine("Octal       : {0}", Convert.ToString(a, 8));
                Console.WriteLine("Hexadécimal : {0}", Convert.ToString(a, 16));
     
     
                Console.ReadLine();
    et je sais aussi que l'on peut faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     BigInteger b = BigInteger.Parse("1234567890123456789012345678901234567890");
      Console.WriteLine("Hexadécimal : {0}", b.ToString("X"));
    Après une première recherche, on ne peut pas provider les BigInteger en binaire simplement en string. En revanche par une requête Linq qui prend les éléments hexa 4 par 4 et les transforme en base 2 tu doit pouvoir faire le taf en une ligne de code sans réaliser un seul calcul.

  3. #3
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    For fun :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BigInteger b = BigInteger.Parse("1234567890123456789012345678901234567890");
     
    var arr = b.ToByteArray().Select(x =>Convert.ToString( Convert.ToInt32(string.Format("{0:X2}", x), 16),2)).Aggregate(new StringBuilder(), (sb,current)=> { return sb.Append(current);}).ToString();

  4. #4
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Juste sur le code (pas sur la manière de procéder) il y a moyen de simplifier encore un peu :
    Pas besoin de formater le byte en string hexa pour le convertir en entier en base 16 et reconvertir ça en base 2 il existe déjà une surcharge de Convert.ToString qui prend un directement byte et une base.
    Du coup on peut se passer du Select et directement faire un Aggregate et tant qu'à faire laisser tomber le bloc "lambda" qui se contente de retourner une valeur et directement passer une lambda "inline" (ça évitera deux accolades et un return inutiles)
    Sur un plan un peu plus personnel, je préfère utiliser la surcharge d'Aggregate qui prend en plus un "resultSelector" pour appliquer une transformation finale au dernier résultat accumulé et ainsi retourner le StringBuilder.ToString là plutôt que de faire le ToString à la fin

    Ce qui donne :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var number = BigInteger.Parse ("1234567890123456789012345678901234567890");
     
    var binaryString = number.ToByteArray ()
        .Aggregate (new StringBuilder (),
                   (builder, x) => builder.Append (Convert.ToString (x, 2)),
                    builder => builder.ToString ());

    Maintenant je ne suis pas certain qu'en l'état ça donne forcément les bons résultats, ToByteArray renvoie les bytes dans "l'ordre inverse" (Little Endian) il faudrait donc soit parcourir à l'envers (avec un Reverse) soit insérer en début de StringBuilder (avec Insert(0, valeur)) mais surtout parce qu'il y a potentiellement un élément en plus pour le bit de signe si nécessaire qui fausse les choses

    Cordialement !

  5. #5
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    Oui ok, effectivement c'est mieux, j'avoue que j'ai pas forcément chercher à l'optimiser, j'aurais dû, c’était juste pour la faisabilité.


    Merci pour le retour ^^.

  6. #6
    Membre actif
    Homme Profil pro
    Aucune
    Inscrit en
    Mars 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Mars 2014
    Messages : 34
    Par défaut
    Bonjour, merci pour vos retour même si c'est en VB.Net que j'ai codé et pas en #C

Discussions similaires

  1. [Python 2.X] Signed float vers binaire, et inversement
    Par Gloubichou dans le forum Général Python
    Réponses: 2
    Dernier message: 18/02/2015, 20h23
  2. Binaire vers Hexa et inversement
    Par Antoinejdu44 dans le forum Débuter
    Réponses: 42
    Dernier message: 03/03/2010, 14h35
  3. afficher un nombre sous format binaire?
    Par sofiane44 dans le forum C++
    Réponses: 2
    Dernier message: 20/01/2006, 18h47
  4. code c pour sockets (udp vers tcp et inversement)
    Par HiT dans le forum Développement
    Réponses: 11
    Dernier message: 19/11/2005, 18h03
  5. [ABAP] Convertir nombre decimal en binaire
    Par danael dans le forum SAP
    Réponses: 3
    Dernier message: 04/04/2005, 12h17

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