Chuyển đổi số nguyên thành nhị phân trong C #


191

Làm thế nào để chuyển đổi một số nguyên thành biểu diễn nhị phân của nó?

Tôi đang sử dụng mã này:

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

Nhưng nó ném một ngoại lệ:

Không thể tìm thấy bất kỳ chữ số có thể phân tích được


1
Bạn đang cố gắng chuyển đổi đại diện chuỗi của một số, hoặc một số thực tế? Và bạn đang cố gắng chuyển đổi sang số thập phân, hay int? Ví dụ của bạn không thực sự phù hợp với câu hỏi của bạn.
ngày

Nếu bạn đang tìm cách chuyển đổi thập phân thành byte, bạn có thể sử dụng mã này: gist.github.com/eranbetzalel/ Kẻ
Eran Betzalel

Bạn đang cố phân tích chuỗi cơ sở 10 thành cơ sở 2. Đó là lý do tại sao cuộc gọi thất bại.
RJ Dunnill

Câu trả lời:


361

Ví dụ của bạn có một số nguyên được thể hiện dưới dạng một chuỗi. Giả sử số nguyên của bạn thực sự là một số nguyên và bạn muốn lấy số nguyên và chuyển đổi nó thành một chuỗi nhị phân.

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

Trả về 1000.


Có phương pháp nào tương tự để chuyển đổi nhị phân thành thập phân không?
kashif

29
@kashif int value = Convert.ToInt32("1101", 2)sẽ cho valuegiá trị 13.
flindeberg

45

Chuyển đổi từ bất kỳ cơ sở cổ điển nào sang bất kỳ cơ sở nào trong C #

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

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

// result == "256"

Các căn cứ được hỗ trợ là 2, 8, 10 và 16


1
Điều này sẽ không hoạt động. Tôi chỉ đơn giản là đã thử string binary = Convert.ToString(533, 26);và có một ArgumentException: Cơ sở không hợp lệ
Magnum

5
Yep, từ MSDN: chỉ căn cứ cổ điển được hỗ trợ msdn.microsoft.com/en-us/library/8s62fh68(v=vs.110).aspx toBase Loại: System.Int32 Các cơ sở của giá trị trả về, mà phải là 2, 8, 10 hoặc 16.
sritmak

37

Rất đơn giản không có mã bổ sung, chỉ cần nhập, chuyển đổi và đầu ra.

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
Đối với một bảng chữ cái chung, điều này nên được thực hiện {[...]} while (số thập phân> 0);
Stefan Steiger

Trong trường hợp số thập phân = 0, kết quả là rỗng. Vui lòng cập nhật vào while (số thập phân> 0 || chuỗi.IsNullOrEmpty (kết quả))
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
Không chắc điều này khác với câu trả lời của Xenon như thế nào.
Joshua Drake

5
Anh ấy đã trả lời điều này trước Xenon
Reza Taibur

9

cách nguyên thủy:

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)không thực hiện chuyển đổi cơ sở vào cơ sở của bạn. Nó giả định rằng chuỗi chứa một số hợp lệ trong cơ sở được chỉ định và chuyển đổi thành cơ sở 10.

Vì vậy, bạn đang gặp lỗi vì "8" không phải là chữ số hợp lệ trong cơ sở 2.

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

Sẽ hiển thị 15(1111 cơ sở 2 = 15 cơ sở 10)

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

Sẽ hiển thị 61440.


4

Tôi biết câu trả lời này sẽ trông giống với hầu hết các câu trả lời đã có ở đây, nhưng tôi nhận thấy rằng không ai trong số họ sử dụng vòng lặp for. Mã này hoạt động và có thể được coi là đơn giản, theo nghĩa là nó sẽ hoạt động mà không có bất kỳ chức năng đặc biệt nào, như ToString () với các tham số, và cũng không quá dài. Có thể một số người thích vòng lặp thay vì chỉ vòng lặp while, điều này có thể phù hợp với họ.

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
Bạn đang phát minh lại bánh xe ở đây. BCL đã chứa các phương thức để làm điều này.
Eltariel

4

Một giải pháp thay thế mà còn inline sử dụng EnumerableLINQlà:

int number = 25;

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

1
Sau khi thử nhiều (nhưng không phải tất cả) các câu trả lời không phải BCL ở đây, đây là câu trả lời đầu tiên tôi thấy thực sự hiệu quả. Hầu hết đều thất bại một cách ngoạn mục.
InteXX

1
cảm ơn bạn đã khám phá mã của tôi :) nhưng như bạn thấy, đó là trò đùa từ quan điểm hiệu suất
Sanan Fataliyev

Chà, chúng ta không thể có mọi thứ, phải không? ;-)
InteXX

3

Hàm này sẽ chuyển đổi số nguyên thành nhị phân trong 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
Bạn nên giải thích làm thế nào mã của bạn trả lời câu hỏi. Vui lòng đọc hướng dẫn SO trước khi đăng.
bugplug

Mã được viết ở trên chuyển đổi số nguyên không dấu thành chuỗi nhị phân của nó.
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;
    }
}

Nguồn học tập:

Mọi thứ bạn cần biết về nhị phân

bao gồm thuật toán để chuyển đổi thập phân thành nhị phân


Cảm ơn vì đã trình diễn phương thức 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
Xin chào ! Bạn nên thêm một số bình luận với mã bạn đã đăng :)
toshiro92

Hàm này sẽ chuyển đổi số nguyên thành nhị phân trong C #. Để chuyển đổi số nguyên thành Nhị phân, chúng tôi liên tục chia thương số cho cơ sở, cho đến khi thương số bằng 0, ghi chú các phần còn lại ở mỗi bước (sử dụng Stack.Push để lưu trữ các giá trị). Sau đó, chúng tôi viết phần còn lại theo chiều ngược lại, bắt đầu ở phía dưới và nối vào bên phải mỗi lần (lặp qua ngăn xếp để in các giá trị).
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 được cung cấp Convert.ToString(n, 2)là tốt, nhưng trong trường hợp bạn cần triển khai thay thế nhanh hơn vài lần so với BCL được cung cấp.

Thực hiện theo tùy chỉnh hoạt động cho tất cả các số nguyên (-ve và + ve). Nguồn gốc được lấy từ https://davidsekar.com/alerskyms/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);
}

Mã trên là thực hiện của tôi. Vì vậy, tôi rất mong muốn được nghe bất kỳ thông tin phản hồi :)


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
Tôi biết rằng mã này khá cơ bản và không quá đơn giản nhưng cũng hoạt động với các số âm
Kiril Dobrev

Bạn đang nhận được số nguyên 32 bit, nhưng mảng đầu ra của bạn có kích thước - 16 bit. Chỉ cần nói ...
David Chelliah

1
Vâng, nhận xét là chính xác. Nó là quyền sử dụng ngắn cho mã này, nhưng nó hoạt động với int aswell. Ví dụ là với số lượng nhỏ. Nếu chúng ta muốn sử dụng số lượng lớn, các loại phải được thay đổi. Ý tưởng là nếu chúng ta muốn làm việc với các số âm, kết quả phải lớn hơn ít nhất một byte để chương trình có thể thấy rằng đây là một mã bổ sung đảo ngược.
Kiril Dobrev

1

Điều này có thể hữu ích nếu bạn muốn một hàm ngắn gọn mà bạn có thể gọi từ phương thức chính của bạn, bên trong lớp của bạn. Bạn vẫn có thể cần gọi int.Parse(toBinary(someint))nếu bạn yêu cầu một số thay vì một chuỗi nhưng tôi thấy phương pháp này hoạt động khá tốt. Ngoài ra, điều này có thể được điều chỉnh để sử dụng forvòng lặp thay vì do- whilenếu bạn muốn.

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

        return binary;
    }

toBinary(10)trả về chuỗi "1010".


Điều này khá giống với câu trả lời của Govind (mà - thật ngạc nhiên - là câu trả lời lặp lại từ phải sang trái tương đương duy nhất trong số tất cả các câu trả lời này) nhưng bạn nói đúng và ngắn gọn hơn. Điều đó nói rằng, tôi không chắc chắn việc chuẩn bị chuỗi như thế này sẽ rất hiệu quả và dù sao bạn cũng không thể đánh bại phương thức tích hợp để đạt hiệu quả. Tôi cũng không thể hiểu tại sao bạn muốn giải thích lại số này dưới dạng số nguyên, nhưng nếu bạn có thể làm điều đó bằng cách xây dựng đầu ra ngoài lũy thừa 10 theo một phương thức tương tự như vậy thay vì thông qua một chuỗi.
Rup

1

Tôi đã gặp vấn đề này trong một thử thách mã hóa khi bạn phải chuyển đổi thập phân 32 chữ số thành nhị phân và tìm sự kết hợp có thể có của chuỗi con.

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 );
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.