FÜR JEDES Bit ab Bit 30 bis Bit 0 in der Variablen "dezi":
Vercshiebe das Bitmuster der Variablen "dezi" so, dass das
aktuelle Bit auf die Position 0 (ganz rechts) kommt. Das Ergebnis
wird in der neuen variablen "aBit" gespeichert .
Führe eine bitweiße AND-Operation der Variablen "aBit" mit
0x00000001 durch. So ergibt sich eine neue Zahl, die wiederum in
"aBit" gespeichert wird .
Gebe nur die Variable "aBit" aus (ohne Zeilenumbruch).
ENDE FÜR JEDES
Hallo,
ich muss oben genannten Algorithmus in C umsetzen und es klappt leider
nicht. Es werden nur positive Werte eingesetzt, und der Algorithmus soll
nun eine dezimal in eine binäre Zahl umwandeln.
FÜR JEDES steht für "for".
Ich habe es so probiert:
int main(){
unsigned int i=0, aBit = 0;
printf("Zahl: ");
scanf("%i", &dezi);
/*Hier der Algorithmus */
for(i=0; i<30; ++i){
dezi >>= 30;
aBit = dezi;
aBit = aBit & 0x00000001;
printf("%i", aBit);
}}
Was, wie mir erst hinter kam, ja nicht funktionieren kann, da bei dezi
>>= 30 nicht das erste sondern alle Bits um 30 nach rechts geschoben
werden. Jetzt komm ich nicht weiter, ich weiß nicht wie ich nur jeweils
das erste Bit verschieben kann. Könnt ihr mir helfen?
Gruß
Bert
Es macht nichts, wenn du alle Bits verschiebst, da durch die Verknüpfung mit 0x01 sowieso nur noch das Bit an Position 1 relevant ist. Alledings veränderst du deine Variable dezi bereits im ersten Schleifendurchlauf. Da beim Schieben von links her mit Nullen aufgefüllt wird steht in dezi spätestens nach dem 2. Schieben nur noch 0 drin. Versuch mal nicht direkt dezi zu verändern, sondern eine weitere temporäre variable zu verwenden oder das Ergebnis des schiebens direkt an aBit zuzuweisen.
Du müsstest, denke ich, erstmal schauen ob ein unsigned int überhaupt 32 Bit hat. Aber das ist ein Nebenproblem. Du hast Recht, das Du mit dezi >>= 30 ALLE Bits verschiebst. Sie sind daher nach dem ersten schieben nicht mehr vorhanden. Falls die Reihenfolge der Bits eine Rolle spielt, so wäre es ja möglich nicht nach rechts sondern nach links zu schieben. Eine weitere Möglichkeit wäre es, nicht die Daten sondern die Maske zu schieben und in der Ausgabe nach 0 oder 1 zu unterscheiden. Falls die Reihenfolge insofern keine Rolle spielt, das auch Bit 0 zuerst ausgegeben werden kann, so kannst Du nach rechts schieben, aber eben immer nur ein Bit auf einmal (nach rechts).
Naja schrieb: > Du müsstest, denke ich, erstmal schauen ob ein unsigned int überhaupt 32 > Bit hat. Aber das ist ein Nebenproblem. Daher sollte man auch lieber gleich uint32_t verwenden...
Bert schrieb:
1 | // > FÜR JEDES Bit ab Bit 30 bis Bit 0 in der Variablen "dezi":
|
2 | // >
|
3 | |
4 | {
|
5 | int i = 30; |
6 | |
7 | do
|
8 | {
|
9 | |
10 | // > Verschiebe das Bitmuster der Variablen "dezi" so, dass das
|
11 | // > aktuelle Bit auf die Position 0 (ganz rechts) kommt. Das Ergebnis
|
12 | // > wird in der neuen variablen "aBit" gespeichert .
|
13 | // >
|
14 | |
15 | unsigned long abit; |
16 | abit = dezi >> i; // dezi muss mind. 31 Bit haben 30..0 |
17 | |
18 | // > Führe eine bitweise AND-Operation der Variablen "aBit" mit
|
19 | // > 0x00000001 durch. So ergibt sich eine neue Zahl, die wiederum in
|
20 | // > "aBit" gespeichert wird .
|
21 | // >
|
22 | |
23 | abit &= 0x00000001; |
24 | |
25 | // > Gebe nur die Variable "aBit" aus (ohne Zeilenumbruch).
|
26 | // >
|
27 | |
28 | putchar(abit ? '1' : '0'); |
29 | |
30 | // > ENDE FÜR JEDES
|
31 | |
32 | } while(--i); |
33 | }
|
TU München, Erstsemester, Programmierpraktikum C =) RICHTIG ?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.