Конвертировать целое число в двоичное в C #


192

Как преобразовать целое число в его двоичное представление?

Я использую этот код:

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

Но это исключение:

Не удалось найти разборчивые цифры


1
Вы пытаетесь преобразовать строковое представление числа или фактическое число? И вы пытаетесь преобразовать в десятичную или int? Ваш пример не соответствует вашему вопросу.
Womp

Если вы хотите преобразовать десятичные числа в байты, вы можете использовать этот код: gist.github.com/eranbetzalel/…
Eran Betzalel

Вы пытаетесь разобрать строку base-10 как base-2. Вот почему звонок не удается.
RJ Dunnill

Ответы:


364

В вашем примере целое число выражено в виде строки. Допустим, ваше целое число было целым числом, и вы хотите взять целое число и преобразовать его в двоичную строку.

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

Который возвращает 1000.


Есть ли подобный метод для преобразования двоичного в десятичное?
Кашиф

30
@kashif int value = Convert.ToInt32("1101", 2)дал valueбы значение 13.
Флиндеберг

45

Конвертировать из любой классической базы в любую базу в C #

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

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

// result == "256"

Поддерживаемые базы 2, 8, 10 и 16


1
Это не будет работать. Я просто попытался string binary = Convert.ToString(533, 26);и получил ArgumentException: Неверная база
Магнум

5
Да, из MSDN: поддерживаются только классические базы msdn.microsoft.com/en-us/library/8s62fh68(v=vs.110).aspx toBase Тип: System.Int32 База возвращаемого значения, которое должно быть 2, 8, 10 или 16.
Sritmak

37

Очень просто без лишнего кода, только ввод, преобразование и вывод.

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
Для универсального алфавита это должно быть сделано {{...]} while (decimalNumber> 0);
Стефан Штайгер

В случае decimalNumber = 0, результат будет пустым. Пожалуйста, обновите до 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
Не уверен, чем это отличается от ответа ксенона.
Джошуа Дрейк

5
Он ответил на это до Ксенона
Реза Тайбур

9

примитивный способ:

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)не делает конвертацию базы в вашу базу. Предполагается, что строка содержит действительное число в указанной базе, и преобразуется в базу 10.

Таким образом, вы получаете ошибку, потому что «8» не является действительной цифрой в базе 2.

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

Покажет 15(1111 база 2 = 15 база 10)

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

Покажет 61440.


4

Я знаю, что этот ответ будет похож на большинство ответов уже здесь, но я заметил, что почти ни один из них не использует цикл for. Этот код работает, и его можно считать простым, в том смысле, что он будет работать без каких-либо специальных функций, таких как ToString () с параметрами, и также не будет слишком длинным. Может быть, некоторые предпочитают цикл for вместо цикла while, это может подойти для них.

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
Вы изобретаете колесо здесь. BCL уже содержит методы для этого.
Эльтариэль

4

Другим вариантом , но и рядное решения с использованием Enumerableи 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
Попробовав многие (но не все) ответы не-BCL здесь, это первый найденный ответ, который действительно работает. Большинство из них проваливаются эффектно.
InteXX

1
спасибо, что открыли мой код :), но, как видите, это шутка с точки зрения производительности
Санан Фаталиев

Ну, мы не можем иметь все, не так ли? ;-)
InteXX

3

Эта функция преобразует целое число в двоичное в 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
Вы должны объяснить, как ваш код отвечает на вопрос. Пожалуйста, прочитайте ТАК рекомендации перед публикацией.
свеча зажигания

Приведенный выше код преобразует целое число без знака в его двоичную строку.
Говинд

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

Источники обучения:

Все, что вам нужно знать о бинарном

в том числе алгоритм для преобразования десятичной в двоичную


Спасибо за демонстрацию метода ToDecimal ().
Раджив

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
Здравствуйте ! Вы должны добавить некоторые комментарии с кодом, который вы разместили :)
toshiro92

Эта функция преобразует целое число в двоичное в C #. Чтобы преобразовать целое число в двоичное, мы многократно делим частное на основание, пока частное не станет равным нулю, отмечая остатки на каждом шаге (для хранения значений используется Stack.Push). Затем мы записываем остатки в обратном порядке, начиная снизу и добавляя каждый раз вправо (цикл через стек для печати значений).
Рахул Шарма

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 предоставляется Convert.ToString(n, 2) хорош, но в случае, если вам нужна альтернативная реализация, которая на несколько тиков быстрее, чем предоставленная BCL.

Следующая пользовательская реализация работает для всех целых чисел (-ve и + ve). Оригинальный источник взят из 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);
}

Выше кода моя реализация. Итак, я готов услышать любые отзывы :)


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
Я знаю, что код довольно простой и не слишком простой, но работает и с отрицательными числами
Кирилл Добрев

Вы получаете 32-битное целое число, но ваш выходной массив имеет размер - 16 бит. Просто говорю ...
Дэвид Челлиа

1
Да, замечание верно. Правильно использовать short для этого кода, но он работает с int aswell. Пример с маленькими числами. Если мы хотим использовать большие числа, типы должны быть изменены. Идея состоит в том, что если мы хотим работать с отрицательными числами, результат должен быть как минимум на один байт больше, чтобы программа могла видеть, что это инвертированный дополнительный код.
Кирилл Добрев

1

Это может быть полезно, если вам нужна краткая функция, которую вы можете вызывать из вашего основного метода внутри вашего класса. Возможно, вам все равно придется звонить, int.Parse(toBinary(someint))если вам требуется число вместо строки, но я считаю, что этот метод работает довольно хорошо. Кроме того, это можно настроить, чтобы использовать forцикл вместо do- whileесли вы предпочитаете.

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

        return binary;
    }

toBinary(10)возвращает строку "1010".


Это в значительной степени совпадает с ответом Говинда (который, к моему удивлению, является единственным эквивалентным итерационным ответом справа налево среди всех этих ответов), но вы правы, он короче и аккуратнее. Тем не менее, я не уверен, что предварительное добавление строк будет очень эффективным, и вы все равно вряд ли превзойдете встроенный метод для повышения эффективности. Я также не понимаю, почему вы захотите снова интерпретировать это как целое число, но если бы вы это сделали, вы могли бы сделать это, построив вывод из степеней 10 аналогичным способом, а не через строку.
Rup

1

Я столкнулся с этой проблемой в задаче кодирования, где нужно преобразовать 32-значное десятичное число в двоичное и найти возможную комбинацию подстроки.

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 );
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.