Konversi integer ke biner di C #


192

Bagaimana cara mengubah angka integer menjadi representasi binernya?

Saya menggunakan kode ini:

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

Tapi itu melempar pengecualian:

Tidak dapat menemukan digit yang dapat diuraikan


1
Apakah Anda mencoba mengonversi representasi string dari angka, atau angka aktual? Dan apakah Anda mencoba mengonversi menjadi desimal, atau int? Contoh Anda tidak benar-benar cocok dengan pertanyaan Anda.
Menginjak

Jika Anda ingin mengonversi desimal menjadi byte, Anda dapat menggunakan kode ini: gist.github.com/eranbetzalel/…
Eran Betzalel

Anda mencoba mengurai string basis-10 sebagai basis-2. Itu sebabnya panggilan gagal.
RJ Dunnill

Jawaban:


364

Contoh Anda memiliki bilangan bulat yang dinyatakan sebagai string. Katakanlah integer Anda sebenarnya adalah integer, dan Anda ingin mengambil integer dan mengubahnya menjadi string biner.

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

Yang mengembalikan 1000.


apakah ada metode serupa untuk mengubah biner menjadi desimal?
kashif

30
@kashif int value = Convert.ToInt32("1101", 2)akan memberikan valuenilai 13.
flindeberg

45

Konversi dari pangkalan klasik apa pun ke pangkalan mana pun di C #

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

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

// result == "256"

Basis yang didukung adalah 2, 8, 10 dan 16


1
Ini tidak akan berfungsi. Saya hanya mencoba string binary = Convert.ToString(533, 26);dan mendapat ArgumentException: Base tidak valid
Magnum

5
Yap, dari MSDN: hanya pangkalan klasik yang didukung msdn.microsoft.com/en-us/library/8s62fh68(v=vs.110).aspx ke Tipe Basis: System.Int32 Basis nilai pengembalian, yang harus 2, 8, 10, atau 16.
sritmak

37

Sangat Sederhana tanpa kode tambahan, hanya input, konversi dan 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
Untuk alfabet generik, ini harus dilakukan {[...]} while (decimalNumber> 0);
Stefan Steiger

Dalam kasus decimalNumber = 0, hasilnya adalah Kosong. Harap perbarui ke while (decimalNumber> 0 || string.IsNullOrEmpty (hasil))
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
Tidak yakin bagaimana ini berbeda dari jawaban Xenon.
Joshua Drake

5
Dia menjawab ini sebelum Xenon
Reza Taibur

9

cara primitif:

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)tidak melakukan konversi basis ke basis Anda. Diasumsikan bahwa string berisi angka yang valid di basis yang ditunjukkan, dan dikonversi ke basis 10.

Jadi Anda mendapatkan kesalahan karena "8" bukan angka yang valid di basis 2.

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

Akan ditampilkan 15(1111 basis 2 = 15 basis 10)

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

Akan ditampilkan 61440.


4

Saya tahu jawaban ini akan terlihat mirip dengan sebagian besar jawaban yang sudah ada di sini, tetapi saya perhatikan hampir tidak ada yang menggunakan for-loop. Kode ini berfungsi, dan dapat dianggap sederhana, dalam arti akan berfungsi tanpa fungsi khusus, seperti ToString () dengan parameter, dan tidak terlalu lama juga. Mungkin beberapa lebih suka for-loop daripada hanya sementara-loop, ini mungkin cocok untuk mereka.

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
Anda menciptakan kembali roda di sini. BCL sudah berisi metode untuk melakukan ini.
Eltariel

4

Alternatif lain tetapi juga solusi inline menggunakan Enumerabledan LINQadalah:

int number = 25;

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

1
Setelah mencoba banyak (tetapi tidak semua) jawaban non-BCL di sini, ini adalah jawaban pertama yang saya temukan yang benar-benar berfungsi. Sebagian besar dari mereka gagal secara spektakuler.
InteXX

1
terima kasih telah menemukan kode saya :) tetapi seperti yang Anda lihat, ini adalah lelucon dari sudut pandang kinerja
Sanan Fataliyev

Ya, kita tidak bisa memiliki semuanya, bukan? ;-)
InteXX

3

Fungsi ini akan mengkonversi integer ke biner di 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
Anda harus menjelaskan bagaimana kode Anda menjawab pertanyaan. Silakan baca pedoman SO sebelum memposting.
Busi

Kode tertulis di atas mengubah angka integer yang tidak ditandai menjadi string binernya.
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;
    }
}

Sumber belajar:

Semua yang perlu Anda ketahui tentang biner

termasuk algoritma untuk mengkonversi desimal ke biner


Terima kasih telah menunjukkan metode ToDecimal () juga.
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
Halo! Anda harus menambahkan beberapa komentar dengan kode yang Anda posting :)
toshiro92

Fungsi ini akan mengkonversi integer ke biner di C #. Untuk mengonversi bilangan bulat menjadi Biner, kami berulang kali membagi hasil bagi dengan basis, sampai hasil bagi adalah nol, membuat catatan sisa pada setiap langkah (digunakan Stack.Push untuk menyimpan nilai-nilai). Kemudian, kami menulis sisanya secara terbalik, mulai dari bawah dan menambahkan ke kanan setiap kali (loop melalui tumpukan untuk mencetak nilai-nilai).
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 disediakan Convert.ToString(n, 2) bagus, tetapi jika Anda membutuhkan implementasi alternatif yang sedikit lebih cepat daripada yang disediakan BCL.

Implementasi kustom berikut berfungsi untuk semua integer (-ve dan + ve). Sumber asli diambil dari 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);
}

Kode di atas adalah implementasi saya. Jadi, saya ingin sekali mendengar tanggapan :)


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
Saya tahu bahwa kode ini cukup mendasar dan tidak terlalu sederhana tetapi bekerja juga dengan angka negatif
Kiril Dobrev

Anda menerima integer 32 bit, tetapi array output Anda berukuran - 16 bit. Hanya mengatakan ...
David Chelliah

1
Ya, komentar itu benar. Ini benar untuk menggunakan kependekan dari kode ini, tetapi ia bekerja dengan int juga. Contohnya adalah dengan angka kecil. Jika kita ingin menggunakan angka besar, jenisnya harus diubah. Idenya adalah bahwa jika kita ingin bekerja dengan angka negatif, hasilnya harus setidaknya satu byte lebih besar sehingga program dapat melihat bahwa ini adalah kode tambahan yang terbalik.
Kiril Dobrev

1

Ini mungkin berguna jika Anda ingin fungsi ringkas yang dapat Anda panggil dari metode utama Anda, di dalam kelas Anda. Anda mungkin masih perlu menelepon int.Parse(toBinary(someint))jika Anda memerlukan nomor alih-alih string tetapi saya menemukan metode ini berfungsi dengan baik. Selain itu, ini dapat disesuaikan untuk menggunakan forloop daripada do- whilejika Anda mau.

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

        return binary;
    }

toBinary(10)mengembalikan string "1010".


Ini hampir sama dengan jawaban Govind (yang - mengejutkan saya - adalah satu-satunya jawaban iteratif kanan-ke-kiri yang setara di antara semua jawaban ini) tetapi Anda benar, lebih pendek dan lebih rapi. Yang mengatakan, saya tidak yakin string yang diawali seperti ini akan sangat efisien, dan Anda tidak mungkin mengalahkan metode bawaan untuk efisiensi. Saya juga tidak bisa melihat mengapa Anda ingin menafsirkan ini sebagai bilangan bulat lagi, tetapi jika Anda melakukannya Anda bisa melakukannya dengan membangun output dari kekuatan 10 dalam metode yang mirip dengan ini daripada melalui string.
Rup

1

Saya menemukan masalah ini dalam tantangan pengkodean di mana Anda harus mengkonversi 32 digit desimal ke biner dan menemukan kemungkinan kombinasi dari 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 );
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.