# zahl als summe von 2er potenzen



## shysdrag (12. Oktober 2005)

hoffe ihr könnt mir ein paar tipps zu diesem c programm geben da ich einfach keine ahnung habe wie man das problem lösen könnte. es soll eine eingegebene zahl als summe von 2er potenzen dargestellt werden. und das ganze nur durch binäre Operatoren (&,<<,>>) und den ternären Operator (?. und auch nur zahlen vom typ unsigned short
ausgegeben sollte ungefähr folgendes werden:

Geben Sie eine Zahl ein: 999
0 * 32768
0 * 16384
0 * 8192
0 * 4096
0 * 2048
0 * 1024
1 * 512
1 * 256
1 * 128
1 * 64
1 * 32
0 * 16
0 * 8
1 * 4
1 * 2
1 * 1


----------



## Mr.Undertaker (12. Oktober 2005)

Das ist nicht so schwer:

Teile die Zahl (999) durch 2. Hat sie einen Rest, dann notiere eine 1, ansonsten eine 0.
Die resultierende Zahl (ohne Rest) teilst du wieder durch 2 .... usw. 

Dein Beispiel:   
999 / 2 = 499,5     =>   REST   1
499 / 2 = 249,5     =>   REST   1
.............
62 / 2   =  31        =>   REST   0
..............

Das Ergebnis musst du dann von unten nach oben ablesen.
Ich hoffe das stimmt jetzt alles so .

Gruß, Christian


----------



## Alexander Schuc (12. Oktober 2005)

Hi.

Denk einfach an die binäre Darstellung von Integer-Zahlen.

999dez = 1111100111bin (Vorne sind jetzt natürlich noch eine 0en dran wenns gespeichert ist.)

Jedes Bit repräsentiert eine Potenz von 2. Die 1 ganz rechts bedeutet 1 * 2^0, die links daneben ist 1 * 2^1, und so weiter.

Mit dem Wissen kannst dir einfach eine kleine Schleife bauen, in der du dir mittels Shiften und dem &-Operator ein Bit rausholst. Die "Bit-Position" in der Zahl sagt bei welcher 2er Potenz du bist, und eine 1 oder 0 sagt dir ob du sie addieren musst oder nicht.

Probiers mal selbst, sollte kein Problem mehr sein, zumindest wenn du das Zahlensystem und die zu verwendenden Operationen verstanden hast.

Wenn du auf schwierigkeiten stoßt, kannst dich ja wieder melden.

MfG,
Alex


----------



## FireFlow (12. Oktober 2005)

```
int main() 
{
	unsigned short zahl = 1;
	for(int i=sizeof(short) * 8; i > 0; --i) {
		unsigned short bit = 1 << i - 1;
		bool set = bit & zahl;
		printf("%d * %d\n", set, bit);
	}
}
```

Man bin ich heute sozial   Geht villeicht noch bisschen preformanter, aber hab grade keine Luste weiter drüber nachzudenken.

Gruß


----------



## shysdrag (13. Oktober 2005)

besten dank für eure hilfe. wenn ich mir dieses "mickey mouse" programm anschaue dann ist das bei mir an den bit operatoren gescheitert. wusste nich wie ich das implementieren sollte. hab jetzt noch ne nette eingabe geschrieben und für die ausgabe musste ich mir auch etwas einfallen lassen, da es in c ja keine bool´schen variablen gibt.


----------



## FireFlow (13. Oktober 2005)

Hmm ich dachte dass mit der Erweiterung vom C Standard der Datentyp bool dazugekommen ist. Ansonsten mach eben:

#define bool int
#define true 1
#define false 0

Gruß


----------



## deepthroat (13. Oktober 2005)

Hi.

Der neue C Standard (C99) unterstützt einen boolschen Typ _Bool und via <stdbool.h> auch bool.


```
#include <stdbool.h>  /* bool, false, true sind Makros die zu
                         _Bool, 0, 1 expandiert werden. */

/* _Bool kann 0 bzw. 1 sein. */
_Bool b1 = false; 
bool b2 = 5;

printf ("%d\n", b2); /* gibt 1 aus */
```


----------



## shysdrag (13. Oktober 2005)

hab das ganze jetzt nochmals mit bool probiert und ich erhalte folgende fehlermeldung: fatal error C1083: Include-Datei kann nicht geoeffnet werden: 'stdbool.h': No such file or directory
Fehler beim Ausführen von cl.exe. wenn ich mir die ganzen include dateien anschaue gibt es bei mir kein stdbool.h. verwende das microsoft visual studio 6.


----------



## deepthroat (14. Oktober 2005)

Hi.

Offensichtlich unterstützt dein Compiler den neuen C Standard von 1999 nicht. Microsoft wird angeblich diesen Standard auch nicht vollständig in ihren Compiler implementieren weil sie mehr auf die Kompatibilität zum C++ Standard achten wollen.

Gruß


----------

