Converti intero in binario in C #


192

Come convertire un numero intero nella sua rappresentazione binaria?

Sto usando questo codice:

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

Ma genera un'eccezione:

Impossibile trovare cifre analizzabili


1
Stai cercando di convertire la rappresentazione in stringa di un numero o di un numero effettivo? E stai cercando di convertire in decimale o int? Il tuo esempio non corrisponde davvero alla tua domanda.
womp

Se stai cercando di convertire i decimali in byte, puoi usare questo codice: gist.github.com/eranbetzalel/…
Eran Betzalel

Stai cercando di analizzare una stringa base-10 come base-2. Ecco perché la chiamata fallisce.
RJ Dunnill,

Risposte:


364

Il tuo esempio ha un numero intero espresso come stringa. Supponiamo che il tuo numero intero sia in realtà un numero intero e desideri prendere il numero intero e convertirlo in una stringa binaria.

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

Che restituisce 1000.


esiste un metodo simile per convertire i binari in decimali?
Kashif,

30
@kashif int value = Convert.ToInt32("1101", 2)darebbe valueil valore 13.
flindeberg

45

Converti da qualsiasi base classica a qualsiasi base in C #

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

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

// result == "256"

Le basi supportate sono 2, 8, 10 e 16


1
Questo non funzionerà. Ho semplicemente provato a string binary = Convert.ToString(533, 26);ottenere ArgumentException: base non valida
Magnum,

5
Sì, da MSDN: solo basi classici sono supportati msdn.microsoft.com/en-us/library/8s62fh68(v=vs.110).aspx base_di_arrivo Tipo: System.Int32 La base del valore di ritorno, che deve essere 2, 8, 10 o 16.
sritmak,

37

Molto semplice senza codice aggiuntivo, solo input, conversione e output.

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
Per un alfabeto generico, questo dovrebbe essere {{...]} while (decimalNumber> 0);
Stefan Steiger

In caso di decimalNumber = 0, il risultato è vuoto. Aggiorna a while (decimalNumber> 0 || string.IsNullOrEmpty (risultato))
akkapolk

13

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
Non sono sicuro di come questo differisca dalla risposta di Xenon.
Joshua Drake,

5
Rispose a questo prima di Xenon
Reza Taibur

9

modo primitivo:

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

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

    return ToBinary(divisor) + remainder;
}

6

Convert.ToInt32(string, base)non esegue la conversione di base nella tua base. Presuppone che la stringa contenga un numero valido nella base indicata e si converta in base 10.

Quindi ricevi un errore perché "8" non è una cifra valida nella base 2.

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

Mostrerà 15(1111 base 2 = 15 base 10)

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

Mostrerà 61440.


4

So che questa risposta sarebbe simile alla maggior parte delle risposte già qui, ma ho notato che quasi nessuno di loro usa un for-loop. Questo codice funziona e può essere considerato semplice, nel senso che funzionerà senza funzioni speciali, come un ToString () con parametri, e non è troppo lungo. Forse alcuni preferiscono i for-loop anziché solo while-loop, questo potrebbe essere adatto a loro.

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;
    }
}

6
Stai reinventando la ruota qui. Il BCL contiene già metodi per farlo.
Eltariel,

4

Un'altra soluzione alternativa ma anche in linea che utilizza Enumerableed LINQè:

int number = 25;

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

1
Dopo aver provato molte (ma non tutte) le risposte non BCL qui, questa è la prima risposta che ho scoperto che funziona davvero. Molti di loro falliscono in modo spettacolare.
InteXX

1
grazie per aver scoperto il mio codice :) ma come vedi, è uno scherzo dal punto di vista delle prestazioni
Sanan Fataliyev

Bene, non possiamo avere tutto, vero? ;-)
InteXX

3

Questa funzione convertirà l'intero in binario in 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
Dovresti spiegare come il tuo codice risponde alla domanda. Si prega di leggere le linee guida SO prima di pubblicare.
candela

Il codice scritto sopra converte il numero intero senza segno nella sua stringa binaria.
Govind

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;
    }
}

Fonti di apprendimento:

Tutto ciò che devi sapere sul binario

compreso l'algoritmo per convertire i decimali in binari


Grazie per aver dimostrato anche il metodo 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
Ciao ! Dovresti aggiungere alcuni commenti con il codice che hai pubblicato :)
toshiro92

Questa funzione convertirà l'intero in binario in C #. Per convertire un numero intero in Binario, dividiamo ripetutamente il quoziente per base, fino a quando il quoziente è zero, prendendo nota dei resti ad ogni passo (usato Stack.Push per memorizzare i valori). Quindi, scriviamo i resti al contrario, iniziando dal fondo e aggiungendo ogni volta a destra (scorrere attraverso la pila per stampare i valori).
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 fornito Convert.ToString(n, 2)è buono, ma nel caso in cui sia necessaria un'implementazione alternativa che è di qualche tick più veloce di quella fornita da BCL.

La seguente implementazione personalizzata funziona per tutti i numeri interi (-ve e + ve). Fonte originale tratta da 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);
}

Il codice sopra è la mia implementazione. Quindi, non vedo l'ora di ricevere feedback :)


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
So che il codice è piuttosto semplice e non troppo semplice ma funziona anche con numeri negativi
Kiril Dobrev,

Stai ricevendo un numero intero a 32 bit, ma l'array di output ha dimensioni di 16 bit.
Sto

1
Sì, l'osservazione è corretta. È giusto usare l'abbreviazione di questo codice, ma funziona anche con int. L'esempio è con piccoli numeri. Se vogliamo usare numeri grandi, i tipi devono essere cambiati. L'idea è che se vogliamo lavorare con numeri negativi, il risultato dovrebbe essere almeno un byte più grande in modo che il programma possa vedere che si tratta di un codice aggiuntivo invertito.
Kiril Dobrev,

1

Questo potrebbe essere utile se desideri una funzione concisa che puoi chiamare dal tuo metodo principale, all'interno della tua classe. Potrebbe essere ancora necessario chiamare int.Parse(toBinary(someint))se si richiede un numero anziché una stringa, ma trovo che questo metodo funzioni abbastanza bene. Inoltre, questo può essere regolato per utilizzare un forciclo anziché un do- whilese preferisci.

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

        return binary;
    }

toBinary(10)restituisce la stringa "1010".


È praticamente la stessa della risposta di Govind (che - con mia sorpresa - è l'unica risposta iterativa da destra a sinistra equivalente tra tutte queste risposte) ma hai ragione, è più breve e più ordinata. Detto questo, non sono sicuro che anteporre le stringhe in questo modo sarà molto efficiente e difficilmente riuscirai a battere il metodo integrato per l'efficienza. Inoltre non riesco a capire perché vorresti interpretarlo di nuovo come un numero intero, ma se lo facessi potresti farlo costruendo l'output di potenze di 10 in un metodo simile a questo piuttosto che tramite una stringa.
Rup,

1

Mi sono imbattuto in questo problema in una sfida di codifica in cui devi convertire i decimali a 32 cifre in binario e trovare la possibile combinazione della sottostringa.

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 );
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.