Tamsayıyı C # olarak ikiliye dönüştür


192

Bir tam sayı, ikili gösterimine nasıl dönüştürülür?

Bu kodu kullanıyorum:

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

Ancak bir istisna atar:

Ayrıştırılabilir rakam bulunamadı


1
Bir sayının dize olarak temsilini veya gerçek bir sayıyı dönüştürmeye mi çalışıyorsunuz? Ve ondalık sayıya veya int'e dönüştürmeye mi çalışıyorsunuz? Örneğiniz, sorunuzla gerçekten eşleşmiyor.
womp

Ondalık değeri bayt'a
Eran

Bir base-10 dizesini base-2 olarak ayrıştırmaya çalışıyorsunuz. Bu yüzden çağrı başarısız oluyor.
RJ Dunnill

Yanıtlar:


364

Örneğinizde dize olarak ifade edilen bir tam sayı var. Diyelim ki tamsayı aslında bir tamsayı ve tamsayıyı alıp bir ikili dizeye dönüştürmek istiyorsunuz.

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

Hangi 1000 döndürür.


ikiliyi ondalığa dönüştürmek için benzer bir yöntem var mı?
kashif

30
@kashif 13 değerini int value = Convert.ToInt32("1101", 2)verir value.
flindeberg

45

Herhangi bir klasik tabandan C # içindeki herhangi bir tabana dönüştürme

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

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

// result == "256"

Desteklenen tabanlar 2, 8, 10 ve 16'dır


1
Bu işe yaramayacak. Ben sadece denedim string binary = Convert.ToString(533, 26);ve bir ArgumentException var: Geçersiz taban
Magnum

5
Evet, MSDN'den: yalnızca klasik tabanlar desteklenir msdn.microsoft.com/en-us/library/8s62fh68(v=vs.110).aspx toBase Type: System.Int32 Dönüş değerinin tabanı, 2 olması gerekir, 8, 10 veya 16.
sritmak

37

Ekstra kod olmadan çok basit, sadece giriş, dönüşüm ve çıkış.

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
Genel bir alfabe için bu {{...]} (decimalNumber> 0);
Stefan Steiger

DecimalNumber = 0 olması durumunda sonuç Boş olur. Lütfen while olarak güncelleyin (decimalNumber> 0 || string.IsNullOrEmpty (sonuç))
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
Bunun Xenon'un cevabından nasıl farklı olduğundan emin değilim.
Joshua Drake

5
Bunu Xenon
Reza Taibur'dan

9

ilkel bir yol:

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)tabanınıza taban dönüşümü yapmaz. Dizenin belirtilen tabanda geçerli bir sayı içerdiğini varsayar ve tabana 10 dönüştürür.

Yani "8" temel 2'de geçerli bir rakam olmadığından hata alıyorsunuz.

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

Gösterecektir 15yerler (1111 taban 2 = 15 taban 10)

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

Gösterecek 61440.


4

Bu cevabın zaten burada bulunan cevapların çoğuna benzeyeceğini biliyorum, ama hiçbirinin for-loop kullanmadığını fark ettim. Bu kod çalışır ve parametrelerle ToString () gibi herhangi bir özel işlev olmadan çalışacağı için basit kabul edilebilir ve çok uzun değildir. Belki bazıları sadece while döngüsü yerine for-loop'ları tercih eder, bu onlar için uygun olabilir.

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
Burada tekerleği yeniden icat ediyorsun. BCL zaten bunu yapmak için yöntemler içermektedir.
Eltariel

4

Başka bir alternatif değil, aynı zamanda satır içi çözüm Enumerableve 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
Burada BCL dışı yanıtların çoğunu (ancak hepsini değil) denedikten sonra, gerçekten işe yaradığını bulduğum ilk cevap bu. Çoğu muhteşem bir şekilde başarısız oluyor.
InteXX

1
kodumu keşfettiğiniz için teşekkür ederim :) ama gördüğünüz gibi, performans açısından şaka
Sanan Fataliyev

Her şeye sahip olamayız, değil mi? ;-)
InteXX

3

Bu işlev, C # 'da tamsayı ikiliye dönüştürür:

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
Kodunuzun soruyu nasıl yanıtladığını açıklamalısınız. Lütfen göndermeden önce SO yönergelerini okuyun.
Buji

Yukarıdaki yazılı kod, imzasız tam sayı numarasını ikili dizgisine dönüştürür.
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;
    }
}

Öğrenme kaynakları:

İkili hakkında bilmeniz gereken her şey

ondalığı ikiliye dönüştürmek için algoritma dahil


ToDecimal () yöntemini de gösterdiğiniz için teşekkür ederiz.
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
Merhaba !
Gönderdiğiniz

Bu işlev, C # 'da tamsayı ikiliye dönüştürür. Tamsayıyı İkili'ye dönüştürmek için, bölüm sıfır olana kadar her adımda kalanları not ederek (değerleri depolamak için Stack.Push kullanılır) bölümü tekrar tekrar tabana böleriz. Sonra, geri kalanları tersine yazıyoruz, her altta başlayıp her seferinde sağa ekliyoruz (değerleri yazdırmak için yığının içinden geçerek).
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

Sağlanan BCL Convert.ToString(n, 2)iyidir, ancak BCL'nin sağladığından daha az keneler olan alternatif bir uygulamaya ihtiyacınız varsa.

Aşağıdaki özel uygulama tüm tamsayılar için çalışır (-ve ve + ve). Orijinal kaynak https://davidsekar.com/algorithms/csharp-program-to-convert-decimal-to-binary adresinden alınmıştır.

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

Yukarıdaki kod benim uygulama. Bu yüzden, herhangi bir geri bildirim duymak için sabırsızlanıyorum :)


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
Kod oldukça basit ve çok basit değil ama aynı zamanda negatif sayılarla da çalıştığını biliyorum
Kiril Dobrev

32 bit tam sayı alıyorsunuz, ancak çıkış diziniz 16 bit boyutunda. Sadece söyleyerek ...
David Chelliah

1
Evet, açıklama doğrudur. Bu kod için kısa kullanım hakkı vardır, ancak int ile de çalışır. Örnek küçük sayılardır. Büyük sayılar kullanmak istiyorsak, türlerin değiştirilmesi gerekir. Fikir şu ki, negatif sayılarla çalışmak istiyorsak, sonuç en az bir bayt daha büyük olmalıdır, böylece program bunun ters bir ek kod olduğunu görebilir.
Kiril Dobrev

1

Bu, ana yönteminizden sınıfınızın içinde arayabileceğiniz kısa bir işlev istiyorsanız yararlı olabilir. int.Parse(toBinary(someint))Bir dize yerine bir numaraya ihtiyacınız varsa yine de aramanız gerekebilir, ancak bu yöntemin oldukça iyi çalıştığını görüyorum. Ayrıca, isterseniz - foryerine bir döngü kullanacak şekilde ayarlanabilir .dowhile

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

        return binary;
    }

toBinary(10)dizeyi döndürür "1010".


Bu, Govind'ün cevabı ile hemen hemen aynıdır (ki - sürprizime göre - tüm bu cevaplar arasında sağdan sola tek eşdeğer cevap), ama haklısın daha kısa ve daha temiz. Bununla birlikte, böyle bir dizenin çok verimli olacağından emin değilim ve yine de verimlilik için yerleşik yöntemi yenmeniz mümkün değil. Bunu neden tekrar bir tam sayı olarak yorumlamak istediğinizi de göremiyorum, ancak bunu yaptıysanız, bunu bir dize yerine benzer bir yöntemle 10'luk güçlerden yapılandırarak yapabilirsiniz.
Rup

1

Bu sorunu 32 basamaklı ondalık sayıyı ikiliye dönüştürmeniz ve alt dizenin olası kombinasyonunu bulmanız gereken bir kodlama sorunuyla karşılaştım.

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 );
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.