Int nach Zeichenkette str in Binaerdarstellung

brahma

brahma

Netzpirat
Ich seh den Wald gerade vor lauter Bäumen nicht, deswegen muss ich euch mal mit was vlt. völlig banalem auf den Keks gehen. Es geht um mein Praktikum C, dort soll ein Taschenrechner gebaut werden, der beim Aufruf die Rechenoperation als Argument bekommt. Das soweit OK, klappt alles. Aber mein Prof möchte auch gerne eine Ausgabe in Binaerform haben....

Aufgabe konkret:
Nachdem Sie den Rechner so weit entwickelt und getestet haben, implementieren Sie nun die fehlende Ausgabe in Binaerdarstellung. Entwickeln Sie hierzu die Funktion void itob(int x, char str[]), die
eine Integerzahl x in die Zeichenkette str in Binaerdarstellung schreibt.

So, vorgegeben ist dann das:
Code:
/* Schreibt Binaerdarstellung von x nach str */
void itob(int x, char str[]);

Daraus habe ich gemacht:

Code:
/* Schreibt Binaerdarstellung von x nach str */
void itob(int x, char str[]){
	char strg[]={};
	int rest=2, i=0;
	// Berechnung der Binär-Stellen. Achtung: Reichenfolge falsch
	while(x > 1 ){
		rest=x%2;
		x=x/2;
		strg[i]= (char) rest;
//		printf("Binär: %i Rest:%i\n", strg[i], x);
		i++;
	}
	i--;
	// Stringfolge drehen für richtige Darstellung
	strg[i]= (char) x;
	while(i>=0){
		int j=0;
		str[j]= '0' + strg[i];
//		printf("String: %i\n",str[j]);
		i--;
		j++;
	}
}

Also die einzelnen Binaerstellen kann ich ja mit Modulo und normaler Teilung herausbekommen, dummerweise natuerlich in falscher Reihenfolge, so dass ich diese wieder drehen muss.

Leider sieht die Ausgabe meine Programms, wenn ich es mit
./Praktikum2 123 + 123
aufrufe, so aus:

Binär: 1 Rest:61
Binär: 1 Rest:30
Binär: 0 Rest:15
Binär: 1 Rest:7
Binär: 0 Rest:3
Binär: 1 Rest:1
String: 49
String: 48
String: 49

Ich habs momentan nur für die erste Zahl gemacht, damit die Zwischenausgabe nicht zu unübersichtlich wird.

Hab dazu 2, naja, 3 Fragen:
1. Hab ich Fehler gemacht bei der Umrechnung Int -> Binaer?
2. Geht das auch einfacher? Es sollen keine C-Funktionen benutzt werden, stdio.h ist die einzige zu includierende Datei.
3. wie drehe ich die Reihenfolge von str so dass der Binaerstring richtig rum ist?

Danke schonmal fürs lesen :D
 
meiner meinung nach isses besser, wenn du bitmasken benutzt...
du iterierst durch von 2^(obere grenze)...bis 2^0(=1) und überprüfst mit dem & operator, ob die maske passt...wenn ja kommt eine 1 in den string sonst 0...
und mit bitoperation kannst du auch wieder die letzte maske von deiner zahl entfernen...

[EDIT:] ich habe folgendes beispiel ausgearbeitet, dass bei mir funktioniert:
Code:
#include<stdio.h>
#include<string.h>

#define MAXBITS 32

void itob ( int, char * );

int main ( ) {
    char bits[MAXBITS+1];
    itob( 500, bits );
    puts( bits );
    return 0;
}

void itob ( int nr, char * str ) {
    int bitnr, maske;

    for( bitnr=MAXBITS; bitnr >=0; bitnr-- ) {
        maske = 1 << bitnr;
        str[MAXBITS-bitnr]= ( nr & maske ? '1' : '0' );
        nr &= ~maske;
    }
    str[MAXBITS+1]='\0';
}
 
Zuletzt bearbeitet:
Hey, das klappt super, vielen Dank.

Hab aber noch ein paar Verständnisfragen, Bitoperationen sind noch nicht so mein ding ;)

Code:
maske = 1 << bitnr;
str[MAXBITS-bitnr]= ( nr & maske ? '1' : '0' );
nr &= ~maske;

Was zur Hölle geht da genau ab? Was machen das ? und das : genau?

Und was ist das?
Code:
#define MAXBITS 32
Oder besser gesagt wie heisst das? Ich muss gleich nochmal googeln :D
 
Was zur Hölle geht da genau ab? Was machen das ? und das : genau?

Stichwort: ternärer operator, ist ne verkürzte if-else Anweisung.

Beispiel (Pseudocode) :

Code:
a = (x == 1 ? y : z)

heisst:

Wenn x gleich 1 setze a auf y, sonst auf z.

#define MAXBITS 32

ist eine Präprozessoranweisung, setzt einen Konstante namens MAXBITS auf 32.
 
Vielen Dank euch beiden, darauf kann ich aufbauen damit ich sowas demnächst auch selber hinbekomme... :D
 
joa habs auch nicht anders gelernt...hoffe, dass das programm nicht allzu verbuggt ist, hab schon seit 2 jahren nix mehr in c/c++ programmiert
 
Hm, das klappte wunderbar, bis auf 2 Fehler:

void itob ( int nr, char * str ) {
int bitnr, maske;

for( bitnr=MAXBITS; bitnr >=0; bitnr-- ) {
maske = 1 << bitnr-1;
str[MAXBITS-bitnr]= ( nr & maske ? '1' : '0' );
nr &= ~maske;
}
str[MAXBITS]='\0';

In der letzten Zeile hattest Du die Anzahl der Elemente um 1 Überschritten, während in der 4. Zeile der Wert 1 zu hoch war. Sah ganz witzig aus in der Praxis, es hatten alle Binärzahlen nur 50% der Numerischen Werte ;)
 

Ähnliche Themen

Keine grafische Oberfläche (Debian Installation)

Crontab und Scripts - Problem

Prozesskommunikation mit PIPES - wie funktioniert das?

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Probleme mit srand()

Zurück
Oben