mikrocontroller.net

Forum: PC-Programmierung Algorithmus in C umsetzen, Bitmanipulation


Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Naja (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bert schrieb:
// > FÜR JEDES Bit ab Bit 30 bis Bit 0 in der Variablen "dezi":
// > 

{
  int i = 30;

  do
  {

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

    unsigned long abit;
    abit = dezi >> i; // dezi muss mind. 31 Bit haben 30..0

// >   Führe eine bitweise AND-Operation der Variablen "aBit" mit
// >   0x00000001 durch. So ergibt sich eine neue Zahl, die wiederum in
// >   "aBit" gespeichert wird .
// > 

    abit &= 0x00000001;

// >   Gebe nur die Variable "aBit" aus (ohne Zeilenumbruch).
// > 

    putchar(abit ? '1' : '0');

// > ENDE FÜR JEDES

  } while(--i);
}

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TU München, Erstsemester, Programmierpraktikum C =) RICHTIG ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.