Перетворити ціле число в двійкове в C #


192

Як перетворити ціле число в його двійкове представлення?

Я використовую цей код:

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

Але це кидає виняток:

Не вдалося знайти проривних цифр


1
Ви намагаєтеся перетворити рядкове представлення числа чи фактичне число? А ви намагаєтеся перетворити в десятковий, або int? Ваш приклад насправді не відповідає вашому питанню.
утроба

Якщо ви хочете перетворити десяткові в байти, можете скористатися цим кодом: gist.github.com/eranbetzalel/…
Еран

Ви намагаєтеся проаналізувати рядок base-10 як base-2. Тому дзвінок не вдається.
RJ Dunnill

Відповіді:


364

Ваш приклад має ціле число, виражене у вигляді рядка. Скажімо, ваше ціле число було насправді цілим числом, і ви хочете взяти ціле число і перетворити його у двійковий рядок.

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

Що повертає 1000.


чи є подібний метод перетворення двійкового в десятковий?
Kashif

30
@kashif int value = Convert.ToInt32("1101", 2)дав би valueзначення 13.
flindeberg

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);і отримав аргументException: Недійсна база
Magnum

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

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 (результат))
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-loops, а не просто while-loop, це може бути для них підходящим.

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 вже містить методи для цього.
Eltariel

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
Ви повинні пояснити, як ваш код відповідає на питання. Будь ласка, прочитайте інструкції SO перед публікацією.
свічка запалювання

Вище написаний код перетворює непідписане ціле число у свій двійковий рядок.
Говінд

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 для зберігання значень). Потім ми пишемо залишки зворотним шляхом, починаючи знизу і додаючи праворуч (цикл через стек для друку значень).
rahul

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
Так, зауваження правильне. Правильно використовувати короткий для цього коду, але він працює з 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.