Konvertieren Sie eine Ganzzahl in eine Binärzahl in C #

191

Wie konvertiere ich eine Ganzzahl in ihre Binärdarstellung?

Ich benutze diesen Code:

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

Aber es wirft eine Ausnahme:

Es konnten keine analysierbaren Ziffern gefunden werden

Thorin Oakenshield
quelle
1
Versuchen Sie, die Zeichenfolgendarstellung einer Zahl oder einer tatsächlichen Zahl zu konvertieren? Und versuchen Sie, in Dezimalzahl oder Int zu konvertieren? Ihr Beispiel passt nicht wirklich zu Ihrer Frage.
Womp
Wenn Sie Dezimalzahlen in Bytes konvertieren möchten
Eran Betzalel
Sie versuchen, eine Base-10-Zeichenfolge als Base-2 zu analysieren. Deshalb schlägt der Anruf fehl.
RJ Dunnill

Antworten:

361

Ihr Beispiel hat eine Ganzzahl, die als Zeichenfolge ausgedrückt wird. Angenommen, Ihre Ganzzahl war tatsächlich eine Ganzzahl, und Sie möchten die Ganzzahl in eine Binärzeichenfolge konvertieren.

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

Welches gibt 1000 zurück.

Anthony Pegram
quelle
Gibt es eine ähnliche Methode, um Binär in Dezimal umzuwandeln?
Kashif
29
@ Kashif int value = Convert.ToInt32("1101", 2)würde valueden Wert 13 geben .
Flindeberg
45

Konvertieren Sie von einer klassischen Basis zu einer beliebigen Basis in C #

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

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

// result == "256"

Unterstützte Basen sind 2, 8, 10 und 16

Sritmak
quelle
1
Dies wird nicht funktionieren. Ich habe einfach versucht string binary = Convert.ToString(533, 26);und eine ArgumentException erhalten: Ungültige Basis
Magnum
5
Ja, von MSDN: Nur klassische Basen werden unterstützt. Msdn.microsoft.com/en-us/library/8s62fh68(v=vs.110).aspx toBase Type: System.Int32 Die Basis des Rückgabewerts, der 2 sein muss. 8, 10 oder 16.
Sritmak
37

Sehr einfach ohne zusätzlichen Code, nur Eingabe, Konvertierung und Ausgabe.

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);
        }
    }
}
Xenon
quelle
1
Für ein generisches Alphabet sollte dies {[...]} while (decimalNumber> 0) sein;
Stefan Steiger
Bei decimalNumber = 0 ist das Ergebnis leer. Bitte aktualisieren Sie auf while (decimalNumber> 0 || string.IsNullOrEmpty (Ergebnis))
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;
    }
Zamir
quelle
2
Ich bin mir nicht sicher, wie sich dies von Xenons Antwort unterscheidet.
Joshua Drake
5
Er antwortete dies vor Xenon
Reza Taibur
9

primitiver Weg:

public string ToBinary(int n)
{
    if (n < 2) return n.ToString();

    var divisor = n / 2;
    var remainder = n % 2;

    return ToBinary(divisor) + remainder;
}
Daniel B.
quelle
6

Convert.ToInt32(string, base)führt keine Basiskonvertierung in Ihre Basis durch. Es wird davon ausgegangen, dass die Zeichenfolge eine gültige Nummer in der angegebenen Basis enthält und in Basis 10 konvertiert wird.

Sie erhalten also eine Fehlermeldung, weil "8" in Basis 2 keine gültige Ziffer ist.

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

Wird zeigen 15(1111 Base 2 = 15 Base 10)

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

Wird zeigen 61440.

Egrunin
quelle
4

Ich weiß, dass diese Antwort den meisten Antworten hier ähnlich aussehen würde, aber ich habe festgestellt, dass fast keine von ihnen eine for-Schleife verwendet. Dieser Code funktioniert und kann als einfach angesehen werden, da er ohne spezielle Funktionen wie ToString () mit Parametern funktioniert und auch nicht zu lang ist. Vielleicht bevorzugen einige For-Loops anstelle von While-Loops. Dies ist möglicherweise für sie geeignet.

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;
}
Kaitlyn
quelle
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;
    }
}
Johnny
quelle
6
Sie erfinden das Rad hier neu. Die BCL enthält bereits Methoden, um dies zu tun.
Eltariel
4

Eine andere Alternative, aber auch Inline-Lösung mit Enumerableund LINQist:

int number = 25;

string binary = Enumerable.Range(0, (int) Math.Log(number, 2) + 1).Aggregate(string.Empty, (collected, bitshifts) => ((number >> bitshifts) & 1 )+ collected);
Sanan Fataliyev
quelle
1
Nachdem ich hier viele (aber nicht alle) Nicht-BCL-Antworten ausprobiert habe, ist dies die erste Antwort, die tatsächlich funktioniert. Die meisten von ihnen scheitern spektakulär.
InteXX
1
Vielen Dank, dass Sie meinen Code entdeckt haben :) Aber wie Sie sehen, ist es ein Witz aus Sicht der Leistung
Sanan Fataliyev
Wir können doch nicht alles haben, oder? ;-)
InteXX
3

Diese Funktion konvertiert eine Ganzzahl in eine Binärzahl in 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;
}
Govind
quelle
3
Sie sollten erklären, wie Ihr Code die Frage beantwortet. Bitte lesen Sie vor dem Posten die SO-Richtlinien.
Zündkerze
Der oben geschriebene Code konvertiert eine vorzeichenlose Ganzzahl in eine binäre Zeichenfolge.
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;
    }
}

Lernquellen:

Alles, was Sie über Binär wissen müssen

einschließlich Algorithmus zur Umwandlung von Dezimal in Binär

Herakles
quelle
Vielen Dank, dass Sie auch die ToDecimal () -Methode demonstriert haben.
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);
        }
     }
Rahul Sharma
quelle
1
Hallo ! Sie sollten einige Kommentare mit dem Code hinzufügen, den Sie gepostet haben :)
toshiro92
Diese Funktion konvertiert eine Ganzzahl in eine Binärzahl in C #. Um eine Ganzzahl in Binär umzuwandeln, teilen wir den Quotienten wiederholt durch die Basis, bis der Quotient Null ist, und notieren uns die verbleibenden Reste bei jedem Schritt (verwenden Sie Stack.Push, um die Werte zu speichern). Dann schreiben wir die Reste in umgekehrter Reihenfolge, beginnend unten und jedes Mal rechts anhängend (Schleife durch den Stapel, um die Werte zu drucken).
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
ABM Rubel
quelle
2

BCL zur Verfügung gestellt Convert.ToString(n, 2) ist gut, aber falls Sie eine alternative Implementierung benötigen, die nur wenige Ticks schneller ist als die von BCL bereitgestellte.

Die folgende benutzerdefinierte Implementierung funktioniert für alle Ganzzahlen (-ve und + ve). Originalquelle von 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);
}

Der obige Code ist meine Implementierung. Ich freue mich auf Feedback :)

David Chelliah
quelle
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;
     }
trinalbadger587
quelle
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();
        }           
    }
Kiril Dobrev
quelle
1
Ich weiß, dass der Code ziemlich einfach und nicht zu einfach ist, aber auch mit negativen Zahlen funktioniert
Kiril Dobrev
Sie empfangen eine 32-Bit-Ganzzahl, aber Ihr Ausgabearray hat eine Größe von 16 Bit.
Ich
1
Ja, die Bemerkung ist richtig. Es ist richtig, short für diesen Code zu verwenden, aber es funktioniert auch mit int. Das Beispiel ist mit kleinen Zahlen. Wenn wir große Zahlen verwenden möchten, müssen die Typen geändert werden. Die Idee ist, dass, wenn wir mit negativen Zahlen arbeiten möchten, das Ergebnis mindestens ein Byte größer sein sollte, damit das Programm erkennen kann, dass dies ein invertierter zusätzlicher Code ist.
Kiril Dobrev
1

Dies kann hilfreich sein, wenn Sie eine übersichtliche Funktion wünschen, die Sie von Ihrer Hauptmethode in Ihrer Klasse aus aufrufen können. Möglicherweise müssen Sie noch anrufen, int.Parse(toBinary(someint))wenn Sie eine Nummer anstelle einer Zeichenfolge benötigen, aber ich finde, dass diese Methode ziemlich gut funktioniert. Darüber hinaus kann dies angepasst werden, um eine forSchleife anstelle von a zu verwenden do- whilewenn Sie dies bevorzugen.

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

        return binary;
    }

toBinary(10)Gibt die Zeichenfolge zurück "1010".

Iona Erofeeff
quelle
Dies ist so ziemlich das Gleiche wie Govinds Antwort (die - zu meiner Überraschung - die einzige äquivalente iterative Antwort von rechts nach links unter all diesen Antworten ist), aber Sie haben Recht, sie ist kürzer und ordentlicher. Trotzdem bin ich mir nicht sicher, ob ein solches Voranstellen von Zeichenfolgen sehr effizient sein wird, und es ist unwahrscheinlich, dass Sie die integrierte Methode für Effizienz ohnehin übertreffen. Ich kann auch nicht verstehen, warum Sie dies wieder als Ganzzahl interpretieren möchten, aber wenn Sie dies tun würden, könnten Sie dies tun, indem Sie die Ausgabe aus Zehnerpotenzen auf ähnliche Weise wie über eine Zeichenfolge konstruieren.
Rup
1

Ich bin auf dieses Problem bei einer Codierungsaufforderung gestoßen, bei der Sie 32-stellige Dezimalstellen in Binärzahlen konvertieren und die mögliche Kombination der Teilzeichenfolge finden müssen.

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

    }
}
Fasil Marshooq
quelle
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 );
}
seyed
quelle