Converter inteiro em binário em C #


191

Como converter um número inteiro em sua representação binária?

Estou usando este código:

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

Mas isso lança uma exceção:

Não foi possível encontrar nenhum dígito analisável


1
Você está tentando converter a representação de seqüência de caracteres de um número ou um número real? E você está tentando converter para decimal ou int? Seu exemplo realmente não corresponde à sua pergunta.
Womp

Se você está procurando para converter decimal em bytes, você pode usar este código: gist.github.com/eranbetzalel/...
Eran Betzalel

Você está tentando analisar uma string de base 10 como base-2. É por isso que a chamada falha.
RJ Dunnill 22/07/19

Respostas:


361

Seu exemplo tem um número inteiro expresso como uma sequência. Digamos que seu número inteiro seja realmente um número inteiro, e você deseja pegar o número inteiro e convertê-lo em uma string binária.

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

O que retorna 1000.


Existe algum método semelhante para converter binário em decimal?
kashif

29
@kashif int value = Convert.ToInt32("1101", 2)daria valueo valor 13.
flindeberg

45

Converter de qualquer base clássica para qualquer base em C #

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

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

// result == "256"

As bases suportadas são 2, 8, 10 e 16


1
Isso não vai funcionar. Eu simplesmente tentei string binary = Convert.ToString(533, 26);e consegui um ArgumentException: Invalid de base
Magnum

5
Sim, do MSDN: somente bases clássicas são suportadas msdn.microsoft.com/en-us/library/8s62fh68(v=vs.110).aspx toBase Type: System.Int32 A base do valor de retorno, que deve ser 2, 8, 10 ou 16.
sritmak 30/04

37

Muito simples, sem código extra, apenas entrada, conversão e saída.

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
Para um alfabeto genérico, deve-se fazer {[...]} while (decimalNumber> 0);
Stefan Steiger

No caso de decimalNumber = 0, o resultado é Vazio. Atualize para while (decimalNumber> 0 || string.IsNullOrEmpty (result))
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
Não tenho certeza de como isso difere da resposta de Xenon.
Joshua Drake

5
Ele respondeu isso antes do Xenon
Reza Taibur

9

maneira primitiva:

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)não faz conversão de base em sua base. Ele pressupõe que a string contenha um número válido na base indicada e converta na base 10.

Portanto, você está recebendo um erro porque "8" não é um dígito válido na base 2.

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

Será exibido 15(1111 base 2 = 15 base 10)

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

Vai mostrar 61440.


4

Eu sei que essa resposta seria semelhante à maioria das respostas já aqui, mas notei que quase nenhuma delas usa um loop for. Esse código funciona e pode ser considerado simples, no sentido de funcionar sem nenhuma função especial, como um ToString () com parâmetros, e também não é muito longo. Talvez alguns prefiram loops for em vez de apenas while, isso pode ser adequado para eles.

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
Você está reinventando a roda aqui. O BCL já contém métodos para fazer isso.
Eltariel

4

Outra solução alternativa, mas também em linha, usando Enumerablee 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
Depois de tentar muitas (mas não todas) as respostas que não são da BCL aqui, esta é a primeira resposta que achei que realmente funciona. A maioria deles falha espetacularmente.
InteXX 20/09/19

1
obrigado por descobrir meu código :) mas como você vê, é piada do ponto de vista do desempenho
Sanan Fataliyev

Bem, não podemos ter tudo, podemos? ;-)
InteXX 21/09/19

3

Esta função irá converter inteiro para binário em 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
Você deve explicar como o seu código responde à pergunta. Leia as diretrizes de SO antes de postar.
sparkplug

O código escrito acima converte o número inteiro não assinado em sua seqüência de caracteres binária.
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;
    }
}

Fontes de aprendizagem:

Tudo o que você precisa saber sobre binário

incluindo algoritmo para converter decimal em binário


Obrigado por demonstrar o método ToDecimal () também.
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
Olá ! Você deve acrescentar alguns comentários com o código que você postou :)
toshiro92

Esta função irá converter inteiro para binário em C #. Para converter inteiro em binário, dividimos repetidamente o quociente pela base, até que o quociente seja zero, anotando o restante em cada etapa (use Stack.Push para armazenar os valores). Em seguida, escrevemos os demais ao contrário, começando na parte inferior e anexando à direita a cada vez (loop na pilha para imprimir os valores).
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

O BCL fornecido Convert.ToString(n, 2)é bom, mas caso você precise de uma implementação alternativa, alguns ticks são mais rápidos que o BCL fornecido.

A implementação personalizada a seguir funciona para todos os números inteiros (-ve e + ve). Fonte original retirada 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);
}

O código acima é minha implementação. Então, estou ansioso para ouvir qualquer 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
Eu sei que o código é bastante básico e não muito simples, mas trabalha também com números negativos
Kiril Dobrev

Você está recebendo um número inteiro de 32 bits, mas sua matriz de saída é de tamanho - 16 bits. Apenas dizendo ...
David Chelliah

1
Sim, a observação está correta. É correto usar abreviação para esse código, mas funciona com int também. O exemplo é com números pequenos. Se queremos usar números grandes, os tipos devem ser alterados. A idéia é que, se queremos trabalhar com números negativos, o resultado deve ser pelo menos um byte maior, para que o programa possa ver que esse é um código adicional invertido.
precisa saber é o seguinte

1

Isso pode ser útil se você quiser uma função concisa que possa chamar do seu método principal, dentro da sua classe. Talvez você ainda precise ligar int.Parse(toBinary(someint))se precisar de um número em vez de uma string, mas acho que esse método funciona muito bem. Além disso, isso pode ser ajustado para usar um forloop em vez de um do- whilese você preferir.

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

        return binary;
    }

toBinary(10)retorna a string "1010".


Isso é praticamente o mesmo que a resposta de Govind (que - para minha surpresa - é a única resposta iterativa da direita para a esquerda equivalente entre todas essas respostas), mas você tem razão: é mais curta e mais organizada. Dito isso, não tenho certeza de que o prefixo de sequência como este seja muito eficiente e é improvável que você consiga vencer o método interno de eficiência de qualquer maneira. Também não consigo entender por que você gostaria de interpretar isso como um número inteiro novamente, mas, se o fizesse, poderia fazer isso construindo a saída com potências de 10 em um método semelhante a este, e não através de uma string.
Rup

1

Me deparei com esse problema em um desafio de codificação, no qual você precisa converter decimal de 32 dígitos em binário e encontrar a possível combinação da substring.

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 );
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.