9
votes

Comment convertir ENTERGER en chaîne binaire en C #?

J'écris un convertisseur de numéro. Comment puis-je convertir un entier en une chaîne binaire en C # sans utiliser de fonctions intégrées ( convert.tostring différentes choses basées sur la valeur donnée)?

  • Binary -> Magnitude de signe
  • binaire -> son complément
  • Binary> Deuxième complément
c#

0 commentaires

8 Réponses :


6
votes

Au moins une partie de la solution consiste à utiliser decimal.GetBits (someValue) pour convertir le nombre décimal en sa représentation binaire.

bitconverter.getbytes peut être utilisé, à son tour, sur les éléments renvoyés par décimal.getbits () pour convertir des entiers en octets.

Vous pouvez trouver le décimal.getbits ( ) Documentation utile.

Je ne suis pas sûr de savoir comment aller d'octets à la décimale, cependant.

Mise à jour: Sur la base de la mise à jour de l'auteur:

bitconverter contient des méthodes permettant de convertir des numéros en octets, qui convient parfaitement à la représentation binaire. Les getBytes () et toint32 () Les méthodes sont pratiques pour les conversions dans chaque direction. La pratique de surcharges ToString () pour créer une représentation de chaîne hexadécimale si vous constaterez que plus facile à interpréter comme 1 et 0.


2 commentaires

Si BitConverterTer.getBytes peut transformer des bits en octets, puis aller d'octets à l'intent, c'est juste BitConverter.get32 (octets d'octets)


@Jimmy - merci. Le lien manquant pour moi est de comprendre comment convertir dans le type décimal à partir d'une gamme d'octets ou d'une matrice de Int32.



0
votes

Ceci est une implémentation dangereuse:

    private static unsafe decimal GetDecimal(Byte[] bytes)
    {
        if (bytes == null)
            throw new ArgumentNullException("bytes");

        if (bytes.Length != sizeof(decimal))
            throw new ArgumentOutOfRangeException("bytes", "length must be 16");

        decimal d = 0;
        byte* dp = (byte*)&d;
        byte[] result = new byte[sizeof(decimal)];
        for (int i = 0; i < sizeof(decimal); i++, dp++)
        {
            *dp = bytes[i];
        }
        return d;
    }


0 commentaires

0
votes

Vous pouvez construire les représentations chiffres par chiffre des premiers principes.

Vous ne savez pas quelles fonctions intégrées que vous ne voulez pas utiliser, mais vous pouvez probablement construire un caractère de chaîne par caractère?

  1. Commencez avec la puissance la plus élevée de deux plus grande que le nombre.
  2. poussez un "1" dans votre chaîne.
  3. Soustrayez cette puissance de deux de votre numéro.
  4. Prenez la puissance la plus basse de deux. Si vous avez atteint la moitié, arrêtez-vous. Vous avez terminé.
  5. Si le nombre à gauche est supérieur à cette puissance de deux, revenez à l'étape 2. Sinon, appuyez sur une "0" dans la chaîne et revenez à l'étape 4.

    Pour son complément et son complément, Calculez ceux qui ont une étape supplémentaire . < / p>

    ou est ainsi trop basique pour ce dont vous avez besoin?


0 commentaires

16
votes

Presque tous les ordinateurs utilisent aujourd'hui la représentation du complément de deux deux en interne, donc si vous faites une conversion directe comme celle-ci, vous obtiendrez la chaîne de complément des deux:

if (x < 0)
  x--;
string onec = Convert(x);


0 commentaires

0
votes

Voici une solution élégante: xxx


0 commentaires

19
votes

SIMPLE SOUTION:

IntToBinValue = Convert.ToString(6, 2);


2 commentaires

C'est de loin la réponse la plus simple que j'ai trouvée!


Malheureusement, cela ne semble pas fonctionner pour des types non signés ...



5
votes
   var a = Convert.ToString(4, 2).PadLeft(8, '0');

0 commentaires

1
votes

Voici le mien: (La partie supérieure convertissait une chaîne binaire 32-Char en entier 32 bits, la partie inférieure convertie entier 32 bits en arrière à la chaîne binaire 32-Char). J'espère que cela aide.

        string binaryString = "011100100111001001110011";
        int G = 0;

        for (int i = 0; i < binaryString.Length; i++)
            G += (int)((binaryString[binaryString.Length - (i + 1)] & 1) << (i % 32));

        Console.WriteLine(G); //‭7500403‬
        binaryString = string.Empty;

        for (int i = 31; i >= 0; i--)
        {
            binaryString += (char)(((G & (1 << (i % 32))) >> (i % 32)) | 48);
        }

        Console.WriteLine(binaryString); //00000000011100100111001001110011


1 commentaires

Correction de bugs mineure pour le caractère le plus à gauche de la chaîne binaire pour un nombre négatif. Devrait être (uint) g & (1 au lieu de g & (1 . Il ressemble à bilarystring + = (((((((((((char) & (1 << (I% 32))) >> (I% 32)) | 48); sans correction de bugs, cela fonctionne toujours bien pour un nombre positif.