Convertir un entier en binaire en C #


202

Comment convertir un nombre entier en sa représentation binaire?

J'utilise ce code:

String input = "8";
String output = Convert.ToInt32(input, 2).ToString();

Mais cela lève une exception:

Impossible de trouver des chiffres analysables


1
Essayez-vous de convertir la représentation sous forme de chaîne d'un nombre ou d'un nombre réel? Et essayez-vous de convertir en décimal ou en entier? Votre exemple ne correspond pas vraiment à votre question.
womp

Si vous cherchez à convertir des décimales en octets, vous pouvez utiliser ce code: gist.github.com/eranbetzalel
Eran Betzalel

Vous essayez d'analyser une chaîne de base 10 comme base 2. C'est pourquoi l'appel échoue.
RJ Dunnill

Réponses:


388

Votre exemple a un entier exprimé sous forme de chaîne. Disons que votre entier était en fait un entier et que vous souhaitiez prendre l'entier et le convertir en chaîne binaire.

int value = 8;
string binary = Convert.ToString(value, 2);

Ce qui renvoie 1000.


1
existe-t-il une méthode similaire pour convertir le binaire en décimal?
kashif

34
@kashif int value = Convert.ToInt32("1101", 2)donnerait valuela valeur 13.
flindeberg

46

Conversion de n'importe quelle base classique vers n'importe quelle base en C #

String number = "100";
int fromBase = 16;
int toBase = 10;

String result = Convert.ToString(Convert.ToInt32(number, fromBase), toBase);

// result == "256"

Les bases prises en charge sont 2, 8, 10 et 16


1
Cela ne fonctionnera pas. J'ai simplement essayé string binary = Convert.ToString(533, 26);et j'ai obtenu une ArgumentException: Base non valide
Magnum

5
Oui, depuis MSDN: seules les bases classiques sont prises en charge msdn.microsoft.com/en-us/library/8s62fh68(v=vs.110).aspx toBase Type: System.Int32 La base de la valeur de retour, qui doit être 2, 8, 10 ou 16.
sritmak

37

Très simple sans code supplémentaire, juste entrée, conversion et sortie.

using System;

namespace _01.Decimal_to_Binary
{
    class DecimalToBinary
    {
        static void Main(string[] args)
        {
            Console.Write("Decimal: ");
            int decimalNumber = int.Parse(Console.ReadLine());

            int remainder;
            string result = string.Empty;
            while (decimalNumber > 0)
            {
                remainder = decimalNumber % 2;
                decimalNumber /= 2;
                result = remainder.ToString() + result;
            }
            Console.WriteLine("Binary:  {0}",result);
        }
    }
}

1
Pour un alphabet générique, cela devrait être do {[...]} while (decimalNumber> 0);
Stefan Steiger

Dans le cas de decimalNumber = 0, le résultat est vide. Veuillez mettre à jour à while (decimalNumber> 0 || string.IsNullOrEmpty (result))
akkapolk

12

http://zamirsblog.blogspot.com/2011/10/convert-decimal-to-binary-in-c.html

    public string DecimalToBinary(string data)
    {
        string result = string.Empty;
        int rem = 0;
        try
        {
            if (!IsNumeric(data))
                error = "Invalid Value - This is not a numeric value";
            else
            {
                int num = int.Parse(data);
                while (num > 0)
                {
                    rem = num % 2;
                    num = num / 2;
                    result = rem.ToString() + result;
                }
            }
        }
        catch (Exception ex)
        {
            error = ex.Message;
        }
        return result;
    }

2
Je ne sais pas en quoi cela diffère de la réponse de Xenon.
Joshua Drake

5
Il a répondu à cela avant Xenon
Reza Taibur

10

manière primitive:

public string ToBinary(int n)
{
    if (n < 2) return n.ToString();

    var divisor = n / 2;
    var remainder = n % 2;

    return ToBinary(divisor) + remainder;
}

2
Échoue avec des négatifs, mais j'ai quand même voté pour parce que c'est une réponse amusante.
BrainSlugs83

appréciée an feedback @ BrainSlugs83
Daniel B

7

Convert.ToInt32(string, base)ne fait pas de conversion de base dans votre base. Il suppose que la chaîne contient un nombre valide dans la base indiquée et se convertit en base 10.

Vous obtenez donc une erreur car "8" n'est pas un chiffre valide en base 2.

String str = "1111";
String Ans = Convert.ToInt32(str, 2).ToString();

Montrera 15(1111 base 2 = 15 base 10)

String str = "f000";
String Ans = Convert.ToInt32(str, 16).ToString();

Montrera 61440.


5

Une autre solution alternative mais aussi en ligne utilisant Enumerableet LINQest:

int number = 25;

string binary = Enumerable.Range(0, (int) Math.Log(number, 2) + 1).Aggregate(string.Empty, (collected, bitshifts) => ((number >> bitshifts) & 1 )+ collected);

1
Après avoir essayé de nombreuses réponses non BCL (mais pas toutes) ici, c'est la première réponse que j'ai trouvée qui fonctionne réellement. La plupart d'entre eux échouent de façon spectaculaire.
InteXX

1
merci d'avoir découvert mon code :) mais comme vous le voyez, c'est une blague du point de vue de la performance
Sanan Fataliyev

Eh bien, on ne peut pas tout avoir, n'est-ce pas? ;-)
InteXX

Cette réponse légitime m'a fait rire. Voici un vote à la hausse, vous le méritez.
BrainSlugs83

4

Je sais que cette réponse ressemblerait à la plupart des réponses déjà ici, mais j'ai remarqué à peu près aucune d'entre elles n'utilise une boucle for. Ce code fonctionne, et peut être considéré comme simple, dans le sens où il fonctionnera sans aucune fonction spéciale, comme un ToString () avec des paramètres, et n'est pas trop long également. Peut-être que certains préfèrent les boucles for plutôt que les boucles while, cela peut leur convenir.

public static string ByteConvert (int num)
{
    int[] p = new int[8];
    string pa = "";
    for (int ii = 0; ii<= 7;ii = ii +1)
    {
        p[7-ii] = num%2;
        num = num/2;
    }
    for (int ii = 0;ii <= 7; ii = ii + 1)
    {
        pa += p[ii].ToString();
    }
    return pa;
}

4
using System;

class Program 
{
    static void Main(string[] args) {

        try {

            int i = (int) Convert.ToInt64(args[0]);
            Console.WriteLine("\n{0} converted to Binary is {1}\n", i, ToBinary(i));

        } catch(Exception e) {
            Console.WriteLine("\n{0}\n", e.Message);
        }
    }

    public static string ToBinary(Int64 Decimal) {
        // Declare a few variables we're going to need
        Int64 BinaryHolder;
        char[] BinaryArray;
        string BinaryResult = "";

        while (Decimal > 0) {
            BinaryHolder = Decimal % 2;
            BinaryResult += BinaryHolder;
            Decimal = Decimal / 2;
        }

        BinaryArray = BinaryResult.ToCharArray();
        Array.Reverse(BinaryArray);
        BinaryResult = new string(BinaryArray);

        return BinaryResult;
    }
}

7
Vous réinventez la roue ici. Le BCL contient déjà des méthodes pour ce faire.
Eltariel

3

Cette fonction convertira un entier en binaire en C #:

public static string ToBinary(int N)
{
    int d = N;
    int q = -1;
    int r = -1;

    string binNumber = string.Empty;
    while (q != 1)
    {
        r = d % 2;
        q = d / 2;
        d = q;
        binNumber = r.ToString() + binNumber;
    }
    binNumber = q.ToString() + binNumber;
    return binNumber;
}

3
Vous devez expliquer comment votre code répond à la question. Veuillez lire les directives SO avant de publier.
bougie d'allumage du

Le code écrit ci-dessus convertit un nombre entier non signé en sa chaîne binaire.
Govind le

3
class Program
{
    static void Main(string[] args)
    {
        var @decimal = 42;
        var binaryVal = ToBinary(@decimal, 2);

        var binary = "101010";
        var decimalVal = ToDecimal(binary, 2);

        Console.WriteLine("Binary value of decimal {0} is '{1}'", @decimal, binaryVal);
        Console.WriteLine("Decimal value of binary '{0}' is {1}", binary, decimalVal);
        Console.WriteLine();

        @decimal = 6;
        binaryVal = ToBinary(@decimal, 3);

        binary = "20";
        decimalVal = ToDecimal(binary, 3);

        Console.WriteLine("Base3 value of decimal {0} is '{1}'", @decimal, binaryVal);
        Console.WriteLine("Decimal value of base3 '{0}' is {1}", binary, decimalVal);
        Console.WriteLine();


        @decimal = 47;
        binaryVal = ToBinary(@decimal, 4);

        binary = "233";
        decimalVal = ToDecimal(binary, 4);

        Console.WriteLine("Base4 value of decimal {0} is '{1}'", @decimal, binaryVal);
        Console.WriteLine("Decimal value of base4 '{0}' is {1}", binary, decimalVal);
        Console.WriteLine();

        @decimal = 99;
        binaryVal = ToBinary(@decimal, 5);

        binary = "344";
        decimalVal = ToDecimal(binary, 5);

        Console.WriteLine("Base5 value of decimal {0} is '{1}'", @decimal, binaryVal);
        Console.WriteLine("Decimal value of base5 '{0}' is {1}", binary, decimalVal);
        Console.WriteLine();

        Console.WriteLine("And so forth.. excluding after base 10 (decimal) though :)");
        Console.WriteLine();


        @decimal = 16;
        binaryVal = ToBinary(@decimal, 11);

        binary = "b";
        decimalVal = ToDecimal(binary, 11);

        Console.WriteLine("Hexidecimal value of decimal {0} is '{1}'", @decimal, binaryVal);
        Console.WriteLine("Decimal value of Hexidecimal '{0}' is {1}", binary, decimalVal);
        Console.WriteLine();
        Console.WriteLine("Uh oh.. this aint right :( ... but let's cheat :P");
        Console.WriteLine();

        @decimal = 11;
        binaryVal = Convert.ToString(@decimal, 16);

        binary = "b";
        decimalVal = Convert.ToInt32(binary, 16);

        Console.WriteLine("Hexidecimal value of decimal {0} is '{1}'", @decimal, binaryVal);
        Console.WriteLine("Decimal value of Hexidecimal '{0}' is {1}", binary, decimalVal);

        Console.ReadLine();
    }


    static string ToBinary(decimal number, int @base)
    {
        var round = 0;
        var reverseBinary = string.Empty;

        while (number > 0)
        {
            var remainder = number % @base;
            reverseBinary += remainder;

            round = (int)(number / @base);
            number = round;
        }

        var binaryArray = reverseBinary.ToCharArray();
        Array.Reverse(binaryArray);

        var binary = new string(binaryArray);
        return binary;
    }

    static double ToDecimal(string binary, int @base)
    {
        var val = 0d;

        if (!binary.All(char.IsNumber))
            return 0d;

        for (int i = 0; i < binary.Length; i++)
        {
            var @char = Convert.ToDouble(binary[i].ToString());

            var pow = (binary.Length - 1) - i;
            val += Math.Pow(@base, pow) * @char;
        }

        return val;
    }
}

Sources d'apprentissage:

Tout ce que vous devez savoir sur le binaire

y compris l'algorithme pour convertir le décimal en binaire


Merci pour la démonstration de la méthode ToDecimal ().
Rajiv

3
    static void convertToBinary(int n)
    {
        Stack<int> stack = new Stack<int>();
        stack.Push(n);
        // step 1 : Push the element on the stack
        while (n > 1)
        {
            n = n / 2;
            stack.Push(n);
        }

        // step 2 : Pop the element and print the value
        foreach(var val in stack)
        {
            Console.Write(val % 2);
        }
     }

1
Salut ! Vous devriez ajouter quelques commentaires avec le code que vous avez posté :)
toshiro92

Cette fonction convertira un entier en binaire en C #. Pour convertir un entier en binaire, nous divisons à plusieurs reprises le quotient par la base, jusqu'à ce que le quotient soit égal à zéro, en notant les restes à chaque étape (utilisé Stack.Push pour stocker les valeurs). Ensuite, nous écrivons les restes en sens inverse, en commençant par le bas et en ajoutant à droite à chaque fois (boucle à travers la pile pour imprimer les valeurs).
rahul sharma

2
class Program{

   static void Main(string[] args){

      try{

     int i = (int)Convert.ToInt64(args[0]);
         Console.WriteLine("\n{0} converted to Binary is {1}\n",i,ToBinary(i));

      }catch(Exception e){

         Console.WriteLine("\n{0}\n",e.Message);

      }

   }//end Main


        public static string ToBinary(Int64 Decimal)
        {
            // Declare a few variables we're going to need
            Int64 BinaryHolder;
            char[] BinaryArray;
            string BinaryResult = "";

            while (Decimal > 0)
            {
                BinaryHolder = Decimal % 2;
                BinaryResult += BinaryHolder;
                Decimal = Decimal / 2;
            }

            // The algoritm gives us the binary number in reverse order (mirrored)
            // We store it in an array so that we can reverse it back to normal
            BinaryArray = BinaryResult.ToCharArray();
            Array.Reverse(BinaryArray);
            BinaryResult = new string(BinaryArray);

            return BinaryResult;
        }


}//end class Program

2

BCL fourni Convert.ToString(n, 2) est bonne, mais au cas où vous auriez besoin d'une implémentation alternative qui est quelques ticks plus rapide que celle fournie par BCL.

La mise en œuvre personnalisée suivante fonctionne pour tous les entiers (-ve et + ve). Source originale tirée de https://davidsekar.com/algorithms/csharp-program-to-convert-decimal-to-binary

static string ToBinary(int n)
{
    int j = 0;
    char[] output = new char[32];

    if (n == 0)
        output[j++] = '0';
    else
    {
        int checkBit = 1 << 30;
        bool skipInitialZeros = true;
        // Check the sign bit separately, as 1<<31 will cause
        // +ve integer overflow
        if ((n & int.MinValue) == int.MinValue)
        {
            output[j++] = '1';
            skipInitialZeros = false;
        }

        for (int i = 0; i < 31; i++, checkBit >>= 1)
        {
            if ((n & checkBit) == 0)
            {
                if (skipInitialZeros)
                    continue;
                else
                    output[j++] = '0';
            }
            else
            {
                skipInitialZeros = false;
                output[j++] = '1';
            }
        }
    }

    return new string(output, 0, j);
}

Au-dessus du code se trouve mon implémentation. Donc, je suis impatient d'entendre vos commentaires :)


1
    // I use this function
    public static string ToBinary(long number)
    {
        string digit = Convert.ToString(number % 2);
        if (number >= 2)
        {
            long remaining = number / 2;
            string remainingString = ToBinary(remaining);
            return remainingString + digit;
        }
        return digit;
     }

1
        static void Main(string[] args) 
        {
        Console.WriteLine("Enter number for converting to binary numerical system!");
        int num = Convert.ToInt32(Console.ReadLine());
        int[] arr = new int[16];

        //for positive integers
        if (num > 0)
        {

            for (int i = 0; i < 16; i++)
            {
                if (num > 0)
                {
                    if ((num % 2) == 0)
                    {
                        num = num / 2;
                        arr[16 - (i + 1)] = 0;
                    }
                    else if ((num % 2) != 0)
                    {
                        num = num / 2;
                        arr[16 - (i + 1)] = 1;
                    }
                }
            }
            for (int y = 0; y < 16; y++)
            {
                Console.Write(arr[y]);
            }
            Console.ReadLine();
        }

        //for negative integers
        else if (num < 0)
        {
            num = (num + 1) * -1;

            for (int i = 0; i < 16; i++)
            {
                if (num > 0)
                {
                    if ((num % 2) == 0)
                    {
                        num = num / 2;
                        arr[16 - (i + 1)] = 0;
                    }
                    else if ((num % 2) != 0)
                    {
                        num = num / 2;
                        arr[16 - (i + 1)] = 1;
                    }
                }
            }

            for (int y = 0; y < 16; y++)
            {
                if (arr[y] != 0)
                {
                    arr[y] = 0;
                }
                else
                {
                    arr[y] = 1;
                }
                Console.Write(arr[y]);
            }
            Console.ReadLine();
        }           
    }

1
Je sais que le code est assez basique et pas trop simple mais fonctionne aussi avec des nombres négatifs
Kiril Dobrev

Vous recevez un entier de 32 bits, mais votre tableau de sortie est de taille - 16 bits. Juste en disant ...
David Chelliah

1
Oui, la remarque est correcte. Il est juste d'utiliser un raccourci pour ce code, mais cela fonctionne également avec int. L'exemple est avec de petits nombres. Si nous voulons utiliser de grands nombres, les types doivent être modifiés. L'idée est que si nous voulons travailler avec des nombres négatifs, le résultat doit être au moins un octet plus grand pour que le programme puisse voir qu'il s'agit d'un code supplémentaire inversé.
Kiril Dobrev

1

Cela peut être utile si vous voulez une fonction concise que vous pouvez appeler à partir de votre méthode principale, dans votre classe. Vous devrez peut-être encore appeler int.Parse(toBinary(someint))si vous avez besoin d'un nombre au lieu d'une chaîne, mais je trouve que cette méthode fonctionne plutôt bien. De plus, cela peut être ajusté pour utiliser une forboucle au lieu d'un do- whilesi vous préférez.

    public static string toBinary(int base10)
    {
        string binary = "";
        do {
            binary = (base10 % 2) + binary;
            base10 /= 2;
        }
        while (base10 > 0);

        return binary;
    }

toBinary(10)renvoie la chaîne "1010".


C'est à peu près la même chose que la réponse de Govind (qui - à ma grande surprise - est la seule réponse itérative équivalente de droite à gauche parmi toutes ces réponses) mais vous avez raison, c'est plus court et plus net. Cela dit, je ne suis pas sûr qu'une chaîne en préfixe comme celle-ci soit très efficace, et il est peu probable que vous battiez de toute façon la méthode intégrée d'efficacité. Je ne vois pas non plus pourquoi vous voudriez à nouveau interpréter cela comme un nombre entier, mais si vous le faisiez, vous pourriez le faire en construisant la sortie à partir de puissances de 10 dans une méthode similaire à celle-ci plutôt que via une chaîne.
Rup

1

Je suis tombé sur ce problème lors d'un défi de codage où vous devez convertir 32 chiffres décimaux en binaire et trouver la combinaison possible de la sous-chaîne.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Numerics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {

        public static void Main()
        {
            int numberofinputs = int.Parse(Console.ReadLine());
            List<BigInteger> inputdecimal = new List<BigInteger>();
            List<string> outputBinary = new List<string>();


            for (int i = 0; i < numberofinputs; i++)
            {
                inputdecimal.Add(BigInteger.Parse(Console.ReadLine(), CultureInfo.InvariantCulture));
            }
            //processing begins 

            foreach (var n in inputdecimal)
            {
                string binary = (binaryconveter(n));
                subString(binary, binary.Length);
            }

            foreach (var item in outputBinary)
            {
                Console.WriteLine(item);
            }

            string binaryconveter(BigInteger n)
            {
                int i;
                StringBuilder output = new StringBuilder();

                for (i = 0; n > 0; i++)
                {
                    output = output.Append(n % 2);
                    n = n / 2;
                }

                return output.ToString();
            }

            void subString(string str, int n)
            {
                int zeroodds = 0;
                int oneodds = 0;

                for (int len = 1; len <= n; len++)
                {

                    for (int i = 0; i <= n - len; i++)
                    {
                        int j = i + len - 1;

                        string substring = "";
                        for (int k = i; k <= j; k++)
                        {
                            substring = String.Concat(substring, str[k]);

                        }
                        var resultofstringanalysis = stringanalysis(substring);
                        if (resultofstringanalysis.Equals("both are odd"))
                        {
                            ++zeroodds;
                            ++oneodds;
                        }
                        else if (resultofstringanalysis.Equals("zeroes are odd"))
                        {
                            ++zeroodds;
                        }
                        else if (resultofstringanalysis.Equals("ones are odd"))
                        {
                            ++oneodds;
                        }

                    }
                }
                string outputtest = String.Concat(zeroodds.ToString(), ' ', oneodds.ToString());
                outputBinary.Add(outputtest);
            }

            string stringanalysis(string str)
            {
                int n = str.Length;

                int nofZeros = 0;
                int nofOnes = 0;

                for (int i = 0; i < n; i++)
                {
                    if (str[i] == '0')
                    {
                        ++nofZeros;
                    }
                    if (str[i] == '1')
                    {
                        ++nofOnes;
                    }

                }
                if ((nofZeros != 0 && nofZeros % 2 != 0) && (nofOnes != 0 && nofOnes % 2 != 0))
                {
                    return "both are odd";
                }
                else if (nofZeros != 0 && nofZeros % 2 != 0)
                {
                    return "zeroes are odd";
                }
                else if (nofOnes != 0 && nofOnes % 2 != 0)
                {
                    return "ones are odd";
                }
                else
                {
                    return "nothing";
                }

            }
            Console.ReadKey();
        }

    }
}

0
    int x=550;
    string s=" ";
    string y=" ";

    while (x>0)
    {

        s += x%2;
        x=x/2;
    }


    Console.WriteLine(Reverse(s));
}

public static string Reverse( string s )
{
    char[] charArray = s.ToCharArray();
    Array.Reverse( charArray );
    return new string( charArray );
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.