You are not logged in.

  • Login

1

Thursday, May 17th 2007, 1:31pm

C Binär in Dezimal

Kann mir jemand sagen wir ich mit C es hinbekomme eine binär Zhal in eine Dezimal zuwandeln ???

Ich möchte das der Benutzer die binäre Zahl ein gibt und das Programm diese umwandelt in eine Dezimalzahl!

Hab mir schon gedanken gemacht! Weiß aber nicht wie ich die einzelnen Stellen aus der binären Zahl rausbekomm.

2

Thursday, May 17th 2007, 1:36pm

Mit modolo 10 bekommst immer genau die letze Ziffer der Zahl.

3

Thursday, May 17th 2007, 3:03pm

Quoted from "SeBa"

Mit modolo 10 bekommst immer genau die letze Ziffer der Zahl.


Das Problem mit deiner Methode ist, dass es schon bei relativ kleinen Dualzahlen schluss ist, da die dann ja in rießigen dezimalzahlen abgebildet werden.

Andere Lösung:
Eingabe in einen std::string und dann per schleife (reverse_iterator?) von hinten nach vorne char für char durchgehen, lesen ob '1' oder '0' und bei jeden durchlaf den multiplikator mit 2 multiplizieren:

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
 
int main()
{
    std::string binaer;
    int erg = 0;
    int mult = 1;
    std::cin >> binaer;
    for (std::size_t idx = binaer.size()-1; idx >= 0; idx--=
    {
        if (binaer[idx] == '1')
        {
            erg += mult;
        }
        erg *= 2;
    }
}


Wenn es C ohne ++ sein soll müsste man halt mit CStrings arbeiten, geht aber eigentlich auf die gleiche Weise, man muss nur das '\0' finden ind die position dann in der schleife statt size() verwenden.

4

Thursday, May 17th 2007, 3:10pm

Hey des hört sich ganz logisch an!
Aber leider bin ich noch ein Anfänger.

Kannst du das für mich vllt in C umschreiben??

wäre sehr net von dir

5

Thursday, May 17th 2007, 4:09pm

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
 
int main()
{
	char binaer[255];
	getline(stdin, binaer, 255);
	printf("test!");
	size_t size;
	int erg = 0;
	int mult = 1;
 
	size_t idx;
 
	for (idx = 0; idx < 255; idx++)
	{
		if (binaer[idx] == '\0')
		{
			size = idx;
			break;
		}
	}
	for (idx = size-1; idx >= 0; idx--) 
	{ 
		if (binaer[idx] == '1') 
		{ 
			erg += mult; 
		} 
		erg *= 2; 
	}
	printf("%d", &erg);
}


Bringt mir noch ein Segmentation Fault, aber das Prinzip würde ich verwenden.

EDIT://
Ein Fehler ist das getline() das, wie ich gerade sehe auch gar kein ANSI-C ist.

EDIT://
Jetzt gehts, size_t ist ja unsigned, da bringts nichts auf >= 0 zu testen:

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
int main() 
{ 
        char binaer[128]; 
	size_t idx;
 
        scanf("%s", binaer); 
        size_t size; 
        int erg = 0; 
        int mult = 1; 
 
 
 
        for (idx = 0; idx < 100; idx++) 
        { 
                if (binaer[idx] == '\0') 
                { 
                        size = idx; 
                        break; 
                } 
        } 
	if (!size) return;
        for (idx = size-1; idx < 500; idx--) 
        { 
                if (binaer[idx] == '1') 
                { 
                        erg += mult; 
                } 
                mult *= 2; 
        } 
        printf("%d", erg); 
}


Wobei die 500 ein willkürlicher Wert sind. (nur größer als der amximale string)

6

Thursday, May 17th 2007, 6:31pm

Quoted from ""darthdespotism""

Das Problem mit deiner Methode ist, dass es schon bei relativ kleinen Dualzahlen schluss ist, da die dann ja in rießigen dezimalzahlen ab

Quoted

gebildet werden.

Versteh ich nicht.

Das in einen String zu schreiben und den dann auszulesen macht überhaupt keinen Sinn und man verschwendet massiv Rechenleistung für etwas, was du eigentlich gar nicht willst. Das alles um nicht nachdenken zu müssen? Grausam!

7

Thursday, May 17th 2007, 6:48pm

Du willst Dualzahlen in Dezimale umwandeln und nimmst int:

Jetzt versuchst du

110100110010 umzuwandeln, ist ja nur 3378. Wenn du jetzt aber beispielsweise so an die Zahl kommen willst:

C Quellcode

1
2
int i;
scanf("%d", &i);


wirst du feststellen, dass die Dualzahl bereits viel zu groß für deinen int ist. Du kannst jetzt unsigned int verwenden, long oder gar unsigned long, aber damit verschiebst du das Problem nur.

Mit einem char bin[31] hast du genug platz um jede binärzahl, die sich in einen int umwandeln lässt zu speichern.

8

Thursday, May 17th 2007, 11:04pm

Wenn der die Eingaben sowieso von stdin oder argv ließt isses eh ein String und muss sowieso konvertiert werden. Aber um eine Zahl zu zerlegen in einen String zu wandeln ist definitiv immer der falsche Weg. Ich würde Zahlen auch immer nur gemäß ihrem realen Wert speichern, alles andere sind nur unterschiedliche Repräsentationen.

9

Thursday, May 24th 2007, 11:24am

wenn du das ganze nur auf dem bildschirm ausgeben willst geht das doch mit %b oder???

also

printf("binärzahl = %b",deine binzahl);


thx, truespin

edit:
sry... hab mich vertan... das geht nur mit %o für oktal und mit %x für hexadezimal...

Similar threads

Social bookmarks