Forum: PC-Programmierung Algorithmus in C umsetzen, Bitmanipulation


von Bert (Gast)


Lesenswert?

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

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

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.

von Naja (Gast)


Lesenswert?

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).

von Uwe .. (uwegw)


Lesenswert?

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...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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
}

von Lehrmann M. (ubimbo)


Lesenswert?

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
Noch kein Account? Hier anmelden.