Dezimal in Binär konvertieren in C

ConanD

Lt. Junior Grade
Registriert
Juni 2004
Beiträge
291
Hi Leute,
hat einer von euch ne ahnung wie ich solch einen Konverter in C programmiere. Den Konverter für Hexadezimal hab ich schon programmiert, was aber auch nicht so schwer war aber bei dem folgenden Problem hab ich überhaupt keinen plan. Also falls einer ne idee hat wäre ich ihm sehr dankbar.

Bisher hab ich folgendes (Konverter soll als case'3' eingefügt werden)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define ESC 27

int Menu(void);
int Dez;
int Hex;

int main(void)
{
while (1)
{
switch (Menu())
{
case '1' :
printf("\nGeben sie den Dezimalwert ein:");
scanf("%i",&Dez);
printf("\nDer Hexadezimalwert lautet: %x",Dez);
getch();
break;
case '2' :
printf("\nGeben sie den Hexadezimalwert ein:");
scanf("%x",&Hex);
printf("\nDer Dezimalwert lautet: %i",Hex);
getch();
break;
default : printf("\a"); break;
case ESC : return(0);
}
}
}

/*----------Menüaufbau----------*/
int Menu (void)
{
int Wahl;
system ("cls");
printf("<1> Dez -> Hex\n");
printf("<2> Hex -> Dez\n");
printf("<3> Dez -> Bin\n");
printf("<4> Bin -> Dez\n");
printf("<ESC> Ende\n\n");
printf("Waehlen Sie : ");
Wahl = getch();
return(Wahl);
}
 
Zuletzt bearbeitet:
Um Dezimalzahlen in beliebige andere Zahlenformate zu wandeln gibt es das sog. Quellverfahren.

Dabei teilst du die Dezimalzahl ganzahlig durch die gewünschte Basis, notierst das Ergebnis und den Restwert (modulo).
Bei einer Division durch 2 wird immer ein Rest 0 oder 1 herauskommen.
Dieses Schema führst du fort bis die Zahl 0 ist und liest von unten nach oben die Reste aus...


29 als Dezimal in Dual:

___|__|___
29 |14|1
14 |7 |0
7 |3 |1
3 |1 |1
1 |0 |1

Ergebnis: 11101
 
Ich weiß wie das auf dem Papier funktioniert, aber hab keinen plan wie ich das jetzt umsetzen soll. Aber trotzdem danke.
 
das problem ist ja, dass du die bin-stelle in der falschen reihenfolge bekommst, daher würd ich mal sagen, legt die ein feld an, dass ein byte größer ist, als die größt mögliche zahl. also 33 stellen, da 32 bit maximal 32 binäre stelle ergeben können...
probiers also mal so:

char binzahl[33]; //da c nett ist, ist das feld mit 0 initialisiert. brauchen wir eigentlich nur für die nullterminierung.

//die eigentliche umwandlung
int pos=0;
//feld zurücksetzen
for (pos=0;pos<32;pos++)
binzahl[pos]='0';
pos=0;
//um jetzt den algo drüber zu jagen.
while (dez!=0)
{
binzahl[32-pos]='0'+dez % 2;
dez=dez / 2;
pos++;
}
printf("%s\n",binzahl);

noch fragen?
 
Hallo,

ist zwar im wesentlichen das gleiche wie von Ghorst, nur mal als Bitschieberei.

Code:
	long lNumber = 682; // 1010101010
	long lCount    = (sizeof lNumber * 8)-1;
	char  lOut[33];

	ZeroMemory( lOut, sizeof lOut ); // oder memset
	while( lCount >= 0)
	{
		lOut[lCount] = ((lNumber & 1) ==  0 ? '0' : '1');

		lNumber = lNumber >> 1;

		lCount--;
	}
	printf( "%s", lOut );

MfG

Arnd
 
Zuletzt bearbeitet:
wenn du schon möglichst knappen code haben (wie deine letzte änderung vermuten lässt), ändere die zeile

lOut[lCount] = ((lNumber & 1) == 0 ? '0' : '1');

noch in

lOut[lCount--] = ((lNumber & 1) ? '1' : '0');

und lass die zeiel
lCount--;
ganz weg.

btw. wieso schreibst du eigentlich win32 code bei so einen simplen ding? wieso nicht nur c mit echten c datentypen?
 
Danke für den Vorschlag :-). Das mit dem Win32 ist einfach nur Gewohnheit. Ich habe die Zeilen einfach bei mir in einem aktuellen Projekt ausprobiert.

Dann aber noch kürzer so:

Code:
	long lNumber = 682; // 1010101010
	long lCount  = (sizeof lNumber * 8);
	char lOut[33];

	lOut[sizeof lOut-1]=0;
	while(lCount > 0)
	{
		lOut[--lCount] = ((lNumber & 1) ==  0 ? '0' : '1');
		lNumber >>= 1;
	}

Meine Absicht war eigentlich nur darauf hinzuweisen, das geteilt durch 2 dem Bitschieben um 1 nach rechts entspricht.

MfG

Arnd
 
Zuletzt bearbeitet:
Und noch eine Variante:

int rest[8], i, zahl;
printf ("Zahl eingeben");
scanf ("%d", &zahl);

for (i=0;i<8;i++)
{
rest= zahl%2;
zahl/ = 2;
}

/*jetzt noch richtig herum ausgeben */

while (i>0)
{
i--;
printf ("%d", rest);
}
 
Ich habe auch noch ne schöne Variante, vielleicht eine, die du leichter verstehst, wenn du auch nur C ein bisschen kannst.

Das Programm kann Dezimalzahlen in Dualzahlen umrechnen und umgekehrt.

Code:
#include <stdio.h>
#include <conio.h>

void dualzahl();
void dezimalzahl();

void main()
{
	char wahl;
	do {
		clrscr();
		printf ("Wie m”chten Sie vorgehen... \n\n");
		printf ("1 - Dualzahl in Dezimalzahl umwandeln");
		printf ("\n2 - Dezimalzahl in Dualzahl umwandeln ");
		printf ("\n\nESC - Programmende");
		fflush (stdin);
		wahl=getch();
		if (wahl=='1')
			dualzahl();
		if (wahl=='2')
			dezimalzahl();
	}
	while (wahl!=27);
}

void dualzahl()
{
	char d0,d1,d2,d3,d4,d5,d6,d7;
	int ergebnis;
	clrscr();
	printf ("Dualzahl in Dezimalzahl umwandeln\n\n");
	printf ("Bitte eine 8-Bit Dualzahl eingeben: ");
	fflush (stdin);
	d0=getche();
	d1=getche();
	d2=getche();
	d3=getche();
	d4=getche();
	d5=getche();
	d6=getche();
	d7=getche();
	ergebnis=(d0-48)+(d1-48)*2+(d2-48)*4+(d3-48)*8+(d4-48)*16+(d5-48)*32+(d6-48)*64+(d7-48)*128;
	printf ("\n\n%i",ergebnis);
	getch();
}

void dezimalzahl()
{
	int x,eingabe;
	clrscr();
	printf ("Dezimalzahl in Dualzahl umwandeln\n\n");
	printf ("Bitte eine Dezimalzahl eingeben: ");
	fflush (stdin);
	scanf ("%i",&eingabe);
	for (x=0;x<8;x++)
	{
		gotoxy (15-x,10);
		printf ("Dualzahl: %i",eingabe%2);
		eingabe=eingabe/2;
	}
	getch();
}
 
Zurück
Oben