C Dezimalzahl in Binärzahl umwandeln

Raptorchicken

Banned
Registriert
Nov. 2012
Beiträge
696
hallo,

ich habe folgende aufgabe: ich soll ein programm schreiben, das mir den betrag einer dezimalzahl in form einer binärzahl ausgibt. die ausgabe soll dabei exakt 31 zeichen (also nullen oder einsen) lang sein. (soll heissen, wenn ich "2" eingebe soll die ausgabe nicht "10" lauten, sondern 0000...00010). es interessieren also nur die 31 bits nach dem vorzeichenbit (von bit 30 bis bit 0). ob die eingegebene zahl tatsächlich positiv ist muss nicht überprüft werden.

das hab ich bisher schon:

Code:
#include <stdio.h>

int main()
{
	int a, b, c, d, i;
		
	printf("Geben Sie bitte eine Dezimalzahl ein: ");
	scanf("%i", &a);
	
	for(i=30 ; i>=0 ; c = (--i))
		{
			d = a >> c;
			b = d & 0x00000001;
			printf("%i", b);
		}
}

kurz die (vorgegebene) idee dahinter: erst das 30. bit nach ganz rechts verschieben, dann das 29 usw.
währenddessen jeweils die "bitwise and 0x00000001" drüberlegen, sodass alle einträge links vom aktuell betrachtetem bit verschwinden. und die jeweils aktuelle übrigbleibende null oder eins wird dann ausgegeben.

es funktioniert auch, aber nur "begrenzt":
es klappt nur mit geraden zahlen. wenn ich eine ungerade zahl eingebe ist der erste eintrag stets eine "1", alles was hinten steht stimmt aber wieder. wie kommt das denn? ;) o0

als beispiel: für "18" kommt richtig "0000...00010010" raus, für "17" aber gibt es mir "1000...00010001" aus. stimmta also bis auf die 1 am anfang auch. *confused*

wär nett wenn mir da jemand schnell helfen könnte, danke :)
 
Zuletzt bearbeitet:
Deutlich einfacher und übersichtlicher.

Code:
#include <stdio.h>                      

int main(int argc, const char * argv[]) 

{
    int a, b[31];
    printf ("\nEingabe einer Dezimalzahl: ");     
    scanf ("%d", &a);                           
    
    for (int i = 0, c = a;i<=30;i++)           
    {                                            
        b[i] = c % 2;                            
        c >>= 1;                                 
    }
    printf ("\nDer Wert von %d dezimal ist ", a);        
    for(int i = 30; i >= 0; --i)               
        if(b[i]<0)
        {
            b[i] = b[i] * -1;
        }
    for(int i = 30; i >= 0; --i)            
    printf ("%d", b[i]);
    printf (" in binär.\n");
}

Edit: Probier es demnächst erstmal auf die rechnerische Weise, wie man auch von Hand die Zahlen umrechnen kann. Das ist gerade zu Beginn deutlich einfacher und für Anfänger ersichtlicher.
Ergänzung ()

Tumbleweed schrieb:
Abgesehen davon ist es schon auffällig, dass diese Frage so häufig auftritt in letzter Zeit. Bekommen alle Schüler die gleichen Hausaufgaben?

Es ist halt eine beliebte Aufgabe für Anfänger.
 
Zuletzt bearbeitet:
der stoff in den ersten semestern an den unis ist meistens kanonisch, von daher ja, es bekommen die "schüler" so ziemlich die selben hausaufgaben ;)
dass das kein hausaufgabenforum ist hab ich nicht gewusst, steht aber auch nirgendswo angepinnt oder so

@ Benni
danke das is nett aber ich versuch den fehler in speziell meinem code zu finden, eben aus lern und verständniszwecken ;)
 
Wenn Du nur ein "Programm schreiben" und keinen "Algorithmus entwerfen" sollst, geht zur Not auch (MSVC, gcc) sowas:

Code:
  ...
  char buffer[sizeof(long)*8+1];
  printf("%031s\n", ltoa(a, buffer, 2));

ltoa() ist nicht ANSI-C, aber meist vorhanden

In deinem Code wird die Variable c erst nach dem ersten Schleifendurchlauf initialisiert, ist also bei der ersten Verwendung uninitialisiert. Daher kommt Mist raus.
 
Zuletzt bearbeitet: (typo)
@Raptorchicken: Konkrete Fragen zu Problemen in den Lösungen sind auch ok. Gerade was Benni22 gemacht hat, ist dann alles andere als begrüßenswert, da es die Faulheit der Leute fördert.

Die Schleife in der Form finde ich allerdings grausam: for(i=30 ; i>=0 ; c = (--i))
Syntaktisch korrekter Code und lesbarer Code sind halt verschiedene Dinge.

@blöderidiot: Du musst deinem Nickname nicht alle Ehre machen, einfach Nachdenken hätte es auch getan... dann wäre klar, dass es hier um das Umsetzen eines Algorithmus geht und auch nicht um das Entwerfen.
 
Dann fang (nur nett gemeint) am besten von neu an. Es ist wie gesagt deutlich einfacher. ;)

Edit: Ob es die Faulheit der Leute fördert oder nicht, liegt an der Person selbst. Genauso kann die Person sehen, wie es auch übersichtlicher und einfacher geht und daraufhin sein Programm überarbeiten.
 
Zuletzt bearbeitet:
1668mib schrieb:
@blöderidiot: Du musst deinem Nickname nicht alle Ehre machen, einfach Nachdenken hätte es auch getan... dann wäre klar, dass es hier um das Umsetzen eines Algorithmus geht und auch nicht um das Entwerfen.

Nö, er schreibt explizit:
ich soll ein programm schreiben
das kann man nicht einfach übergehen. Ausserdem hab ich ihm gesagt, wo der Fehler liegt.
 
@ 1668mib

hab mir deinen hinweis bezüglich der schleife mal zu herzen genommen und siehe: es klappt :D

habe statt

Code:
for(i=30 ; i>=0 ; c = (--i))

jetzt

Code:
 for(i=30 ; i>=0 ; --i)
{...
c = i;
...}

geschrieben das hats ausgemacht. danke :)
 
Er betritt mit dem &a schon die grosse Kunst der Pointerarithmetics, welches von Anfängern in Multitasking Systemen vermieden werden sollte der Systemstabilität wegen.
 
@DigitalIllusion: Sinnlose Beiträge sollten der Übersicht wegen auch vermieden werden.
Wenn du mir jetzt kurz sagst, wie er die Eingabe in einfachem C ohne "Pointerarithmetics" macht, bekommst nen Keks...



Edit:
@blöderidiot: Ich hab auch nicht gesagt "wörtlich lesen" sondern "nachdenken". Danke dass du meine Vorurteile aber bestätigt hast.
 
Zuletzt bearbeitet:
K&R C nicht benutzen. Das sollen nur die Profis. Ich hab ne Tafel Schokolade da.
 
Und Kinder sollten ohne Aufsicht der Eltern besser nicht an den PC... hast dir die Schokolade aber verdient, Zähneputzen aber nicht vergessen!
 
Wenn das die Kernelcoder lesen...

ich kann dem TE dennoch behilflich sein. Werfe einen Blick auf
mycsharp

Halte auch Ausschau nach MVPs. NOBUGZ ist ein Alien.

Dort sind renomierte Programmierer unterwegs, die Dir astrein helfen können fernab von dem Alten, fehleranfälligem Code.

Good Luck !
 
Zuletzt bearbeitet:
DigitalIllusion schrieb:
Wenn das die Kernelcoder lesen...

Ich hab bei mir auch schon mal versehentlich einen Pointer verwendet. O-oo, da hat aber im Gebäude das Fundament gewackelt!
 
Ich weiß jetzt nicht, ob der Aufgabensteller, der keine C-Profis ausbilden will, sich freut, wenn er statt C dann C#-Code abgibt...
 
Er kann das auch in x86 oder amd64 Assembler abliefern...X86 Mode, uffschalten zu Real Mode und dann uffschalten zu 386 Mode und Addressbreite gewinnen als Taktzyklenzähler. Wenn er sowas begreifen will, dann ja, wenn Er einen guten modernen MMU geschüzten Code schreiben will, dann nimmt er was Moderneres als KR Native C.

Ich habe das in X86 Assembler abgeliefert, meine Arbeit, ich brauchte gar nicht mehr zum Unterricht kommen, Dr. Flume hat das so akzeptiert.

100%, ne glatte Eins.

Prinzipiell sagt man, das man in schierem C schneller voran kommt als in Assembler. Wer gar keine Assembler Kenne hat, macht besser einen großen Bogen um natives C. Gerade wegen der Pointerarithmetics gibt es OO. ObjektOrientierte Programmierung mit C++.
 
Zuletzt bearbeitet:
Zurück
Oben