Dual in Binär

blizZar

Mitglied
Hi,
Ich hab ein Programm zur Umwandlung von Dualzahlen in Binärzahlen geschrieben. Es funktioniert auch, aber leider wird die Binärzahl falschrum ausgegeben. Beispiel:

Dualzahl: 5,
Binärzahl: 0101
Ausgabe: 1010

Code:
#include <stdio.h>

char *putbits(int);
void show(int, int);

main()
{
    unsigned int x,y;

        printf("\n\t1. Dezimalzahl: ");
        fflush(stdin);
        scanf("%i", &x);
        printf("\t2. Dezimalzahl: ");
        fflush(stdin);

        scanf("%i", &y);
        show(x,y);
}

char *putbits(int x)
{
    int i;
    static char a[9];

        for(i = 0; i < 8; i++)
        {
            a[i]=(x>>i)&1 ? '1' : '0';
        }
    return a;
}

void show(int x, int y)
{
    unsigned int z;

        printf("\n\n\t 1. Binaerzahl: %s", putbits(x));
        printf("\n\t 2. Binaerzahl: %s", putbits(y));

        z = x&y;

        printf("\n\n x&y:        %s", putbits(z));

        z = x|y;

        printf("\n\n x|y:        %s", putbits(z));

        z = x^y;

        printf("\n\n x^y:        %s", putbits(z));

        z = ~x;

        printf("\n\n ~x:        %s", putbits(z));

        z = ~y;

        printf("\n\n ~y:        %s\n", putbits(z));
        getch();
}

Ich hoffe ihr könnt mir helfen :D

mfg
 
Hallo,

ersetz mal (ungetestet)

Code:
a[i]=(x>>i)&1 ? '1' : '0';

durch

Code:
a[7-i]=(x>>i)&1 ? '1' : '0';

Markus
 
Versuch's doch mal, indem Du die Schleife in der anderen Richtung ab arbeitest.
Code:
for(i = 7; i >=0; i--)

Hab's aber nicht getestet.

Ups da war einer schneller
 
Hallo,

ok fangen wir mal an:

Code:
(x>>i)
bedeutet soviel wie den wert x um i Stellen binär zu verschieben. Eine Stellenverschiebung um eine Stelle kannst du mit einer ganzzahlige Division durch 2 (ohne Rest) gleichsetzen.

Nach dieser Verschiebung hat das niederwertigste Bit entweder den Wert 0 oder 1.
Mit
Code:
(x>>i)  & 1
testest Du nun, ob dieses Bit bei einer binären AND-Verknüpfung mit binär 1 wiederum binär 1 ist. Also im Prinzip:

Code:
       zu testendes Bit
       |
       |
       v
10101011  <--- der zu testende Wert
00000001  <--- Test-"Maske"
--------
00000001  <---- Ergebnis


Für dieses Beispiel prüfst du damit also, ob das niederwertigste Bit nun 1 ist.

Die Konstruktion
Code:
?:
wird verwendet als Kurzschreibweise für ein if-then. Was nach dem "?" kommt, wird ausgeführt/benutzt sofern der Ausdruck davor wahr ist. Andernfalls der Code nach dem ":".
Im Beispiel wird nun also entweder "1" oder "0" zurückgeben und zu guter Letzt in das Zeichen-Array a an Stelle i, also in a[i] geschrieben.

Markus
 
Zuletzt bearbeitet:
:offtopic: , aber ich denke nicht dass du eine Dualzahl in eine Binärzahl umwandeln willst. Da gäbe es nicht viel zu tun. Richtig wäre wohl eher eine Dezimalzahl in eine Binärzahl umzuwandeln :-)
 
^^ hast recht;D
aber hab noch mal ne frage zu nem anderen thema und will da jetzt kein neues topic erstellen.

Und zwar gehts um Sturcts.
Wenn ich mit funktionsprototypen arbeite muss ich doch schreiben:


Code:
struct name
{
     int a;
     int b;
};

void function(struct name *);


void main()
{
    struct name * var;

    funtion(&var);
}

void function(struct name * var)
{
}

We gesagt mir gehts hier umd die parameterliste im prototyp und wollte fragen ob das so richtig ist.
 
@lmarkus31 Vielen Dank für deine Erklärung, ich kannte diesen Verschiebungsoperator noch nicht, kenne aber deren Bedeutung aus der Assemblerprogrammierung.

@blizZar Probiere es doch einfach aus...

Soweit ich weiß ist das aber nicht korrekt. Mit struct hast du dir einen neuen Datentyp definiert.
C:
struct name
{
     int a;
     int b;
};
void function(name test)
{}
void main()
{
    name test;
    funtion(test);
}

mfg
 
Hi.
@blizZar Probiere es doch einfach aus...

Soweit ich weiß ist das aber nicht korrekt. Mit struct hast du dir einen neuen Datentyp definiert.
Da ist erstmal die Frage ob es sich um C oder C++ Code handelt.
C:
struct name
{
     int a;
     int b;
};
void function(name test)
{}
void main()
{
    name test;
    funtion(test);
}
Dein Code ist jedenfalls kein gültiger C Code (und nicht nur wegen dem "void main" - es muß "int main()" heißen), da "name" kein definierter Typ ist. Das kann man allerdings folgendermassen erreichen:
C:
typedef struct { int a, b; } name;
In C++ ist das nicht notwendig, da wäre dein Code ok (abgesehen von "void main" natürlich).

Gruß
 
Zurück