cpp zahl in binär umwandeln (Schwer)

10/12/2014 16:17 blubber6#1
hiho

ich muss mit cpp ein programm schreiben, dass eine zahl einliest und daraus die binär zahl ausgibt,
die schwirigkeit bestaht darin, dass für mich alle normalen möglichkeiten gestrichen wurde.

verboten sind der gebrauch von;

arrays, vecotrs, lists etc
funktionen zu definieren ausser der main etc,

meine idee besteht darin, das mit modulo 2 zu machen und nem loop, was soweit auch geht nur LSB und so steht an der falschen stelle, es kommt also genau die verkehrte binärzahl raus bei 6 kommt 011 anstelle von 0110
es kann ja nicht sein, dass ich die alle zuerst in ints speichern muss danach ausgeben?
nun hat wer ne idee dazu?
10/12/2014 16:34 Dr. Coxxy#2
mal genauer definieren, was verboten ist.

beispiel:

Code:
	unsigned int blubb = 0x12345678;

	for (int i = sizeof(blubb)*8-1; i >= 0; i--)
	{	
		putc('0' + ((blubb >> i) & 1), stdout);
	}
10/12/2014 17:03 blubber6#3
hey
sizeof als funktion ist leider nicht zugelassen

zugelassen sind nur

loops, variablen, cin, cout solche sachen halt

so hab ichs versucht, aber problem wie geschildert
Code:
#include <iostream>
using namespace std;

int main ()

{

int n;
cout << "gib eine zahl n an ";
cin >> n ;

int var = (n);
cout << var;
while(var != 0){
cout << var%2;
var = var/2;
}
return 0;

}
10/12/2014 17:07 Dr. Coxxy#4
sizeof ist keine echte funktion, kannst auch einfach hart int i = 31 einsetzen wenn du ne 4byte zahl einliest.
10/12/2014 17:08 th0rex#5
Was hindert dich daran das einfach auszurechnen ? sizeof(int) = 4 wenn du für 32bit compilst. Ersetzt du halt das sizeof(blubb)*8-1 mit 31.

Edit: Zu langsam ;(
10/12/2014 17:32 blubber6#6
und was wenns keine 4 bit ist ? dann mit if und fallunterscheidungen ?
ich mag mich entsinnen, dass man das iwie mit dem negativen + 1 machen kann sieht jemand da ne möglichkeit ?
10/12/2014 17:50 Dr. Coxxy#7
c++ ordentlich mit einem buch lernen.
dich in einem verständlichem satz auszudrücken könnte auch helfen.
die größe ist durch den typ und den compilerdefinitionen fest vorgegeben.
10/14/2014 09:51 ƬheGame#8
Ihr seit Helden ^^

Code:
int main()
{
  int a, b, c;
 
  printf("Enter an integer in decimal number system\n");
  scanf("%d", &a);
 
  printf("%d in binary number system is:\n", a);
 
  for (b = 31; b >= 0; b--)
  {
    c = a >> b;
 
    if (c & 1)
      printf("1");
    else
      printf("0");
  }
 
  printf("\n");
 
  return 0;
}
Die 31 kannst du auch für jede Zahl errechnen in dem du schaust wie oft sie sich /2 teilen lässt + 1 ^^
10/14/2014 09:57 IchBin<<#9
Quote:
Originally Posted by ƬheGame View Post
Ihr seit Helden ^^

Code:
int main()
{
  int a, b, c;
 
  printf("Enter an integer in decimal number system\n");
  scanf("%d", &a);
 
  printf("%d in binary number system is:\n", a);
 
  for (b = 31; b >= 0; b--)
  {
    c = a >> b;
 
    if (c & 1)
      printf("1");
    else
      printf("0");
  }
 
  printf("\n");
 
  return 0;
}
Die 31 kannst du auch für jede Zahl errechnen in dem du schaust wie oft sie sich /2 teilen lässt + 1 ^^
Nicht ganz perfekt, aber wir wollen ja nicht seine ganzen Hausaufgaben machen :D ;)
10/14/2014 11:26 Dr. Coxxy#10
Quote:
Originally Posted by ƬheGame View Post
Ihr seit Helden ^^
seid*

Und wo ist genau der unterschied zu meiner lösung, außer dass se wesentlich unperfomanter ist?
10/14/2014 11:47 warfley#11
Deine Vorgaben sind jetzt keine wirklichen Einschränkungen, wie du es direkt als String ausgibst würde dir ja schon gezeigt, was du machen kannst um sie zwischen zu speichern, du erstellst eine struct bestehend aus einem Byte für die Länge, und einen boolpointer auf die Ziffern
Dann trägst du über eine schleife in den pointer wahr oder falsch ein, increased den pointer, und erhost die Länge um eins, und am Ende setzt du den pointer wieder auf die erste Ziffer
10/14/2014 11:48 ƬheGame#12
Quote:
Originally Posted by Dr. Coxxy View Post
seid*

Und wo ist genau der unterschied zu meiner lösung, außer dass se wesentlich unperfomanter ist?
Man darf kein sizeof brauchen :p und wie er die 31 weg bekommt hab ich ihm ja gesagt also macht es alles was es soll.

Quote:
Originally Posted by warfley View Post
Deine Vorgaben sind jetzt keine wirklichen Einschränkungen, wie du es direkt als String ausgibst würde dir ja schon gezeigt, was du machen kannst um sie zwischen zu speichern, du erstellst eine struct bestehend aus einem Byte für die Länge, und einen boolpointer auf die Ziffern
Dann trägst du über eine schleife in den pointer wahr oder falsch ein, increased den pointer, und erhost die Länge um eins, und am Ende setzt du den pointer wieder auf die erste Ziffer
und du bist dir sicher das du so einen Aufwand für sowas simples betreiben willst? ^^ Nicht das es nicht funktionieren würde. Man könnte das ganze auch mit ganz anderen Rechenmethoden machen die noch viel effizienter sind aber am ende muss die Aufgabe erfüllt sein und da ist der einfachste weg der richtige weg.
10/14/2014 12:56 warfley#13
Quote:
und du bist dir sicher das du so einen Aufwand für sowas simples betreiben willst? ^^ Nicht das es nicht funktionieren würde. Man könnte das ganze auch mit ganz anderen Rechenmethoden machen die noch viel effizienter sind aber am ende muss die Aufgabe erfüllt sein und da ist der einfachste weg der richtige weg.
Naja wenn die aufgabe nur ist das es ausgegeben werden soll ist das natürlich kompletter overkill, aber wenn damit im nachinein weiter gerechnet werden soll ist das wohl die einfachste möglichkeit das ganze zwischen zu speichern, ohne arrays und listen zu verwenden
10/14/2014 14:12 ƬheGame#14
Quote:
Originally Posted by warfley View Post
Naja wenn die aufgabe nur ist das es ausgegeben werden soll ist das natürlich kompletter overkill, aber wenn damit im nachinein weiter gerechnet werden soll ist das wohl die einfachste möglichkeit das ganze zwischen zu speichern, ohne arrays und listen zu verwenden
Jo das meinte ich ^^
Habe auch immer viel zu viel gemacht bis einmal eine Prüfung kam die so gross war das du einfach keine Zeit hattest etwas schön zu machen. Sobald es für etwas Noten gibt muss man einfach schauen das man die Vorgaben erfüllt, wenn das nicht geht muss es wenigstens irgendwie laufen, aber nie zu viel Machen. Gibt sowieso nie plus Punkte ^^ Meiner Meinung nach der falsche Weg aber so ist es halt.