C# Binärzahl

cm3107

Cadet 2nd Year
Registriert
Aug. 2009
Beiträge
25
Hey verstehe folgendes Programm nicht ganz:
Code:
Console.Write("Binärzahl eingeben: ");
            string s = Console.ReadLine();
            int dzahl = 0;
            foreach (char c in s)
            {
                dzahl = (dzahl * 2) + c - 48;
            }
            Console.WriteLine(dzahl);

Das Problem ist das dzahl in der Schleife. Was passiert in der Schleife genau?
Das +c -48 ist versteh ich nur nicht wie das dzahl funktioniert.
 
Die Asciitabelle ist nicht das Problem sondern das dzahl.
Sagen wir z.b. die Binärzahl ist 1011.
Gerechnet wird dann 1*2^3+0*2^2+1*2^1+1*2^0
Aber inwiefern macht die Schleife das?
Bei (+c-48) kommt 1 oder 0 raus aber was macht das dzahl*2?
 
Sicher? mMn. wäre der erste Durchlauf:

(0 * 2) + 1 - 48 = -47

Ergibt soweit keinen Sinn, danach gehts noch weiter ins negative.
 
Blo0DLusT schrieb:

Erster Durchlauf
(0 * 2) + 49 - 48 = 1 -> dzahl = 1
Zweiter Durchlauf
(1 * 2) + 48 - 48 = 2 -> dzahl = 2
Dritter Durchlauf
(2 * 2) + 49 - 48 = 5 -> dzahl = 5
Vierter Durchlauf
(5 * 2) + 49 - 48 = 11 -> dzahl = 11

1011 ist im dezimalen 11
 
Gut gehen wir mal die ganze Schleifen am Beispiel 1011 durch:
(0 * 2) + 49 - 48 = 1
(1 * 2) + 48 - 48 = 2
(2 * 2) + 49 - 48 = 5
(5 * 2) + 49 - 48 = 1
Ist das so richtig?
Gut und wieso erhöht sich das dzahl?0->1->2->5?
 
Zuletzt bearbeitet: (Fehlerbeseitigung)
Wenn du uns nun noch näher bringen könntest, wo du dir die 49 herzauberst ;)
Bzw findet da eine implizite Typenumwandlung von Char in den Ascii Wert von Char statt?
 
Ich programmiere zwar nicht in C#, aber ich denke der Sinn ist der folgende:

Das Programm erwartet die Eingabe einer Binärzahl, also einer Zahl bestehend nur aus Nullen und Einsen, z. B. 110101. Diese Eingabe liest es als Text (String s) ein. Danach durchläuft die Schleife den String s zeichenweise (Buchstabe (Char) c).

In der Zeile in der Schleife scheint C# c als ASCII Wert zu interpretieren, der bei 0 die 48 und bei 1 die 49 beträgt. Dadurch ergibt c-48 bei einer 0 den Wert 0 und bei einer 1 den Wert 1.

Wenn jetzt die Schleife durch laufen wird, wird jetzt der Wert von dZahl bei jedem Durchlauf geändert. Beim ersten Durchlauf ist dZahl zunächst 0 und bekommt durch den Durclauf bei meinem Beispiel 110101 den Wert 1, da 0*2 + 49 - 48 = 1, als hat dZahl mit Beginn des zweiten Durchlaufes den Wert 1, sodass im zweiten Durchlauf daraus 1*2 + 49 - 48 = 3 wird. Im driten durchlauf erigbt sich dann 2*3 + 48 - 48 = 6, im vierten 2*6 + 49 - 48 = 13, dann 2*13 + 48 - 48 = 26 und schließlich 2*26 + 49 - 48 = 53.

Damit hast du dann 110101 (binär) = 53 (deximal).
 
Warum so kompliziert ? :D

Code:
Console.Write("Binärzahl eingeben: ");
int dzahl = Convert.ToInt32(Console.ReadLine(), 2);
Console.WriteLine(dzahl);

, 2 = Basis 2 Binär (0 und 1)
, 8 = Basis 8 Octal (0 bis 7)
, 10 = Basis 10 Dezimal (0 bis 9)
, 16 = Basis 16 Hexadezimal (0 bis 9 & A bis F)
 
Zurück
Oben