Binärdarstellung
-
Nein,leider nicht

-
Versteh aber leider auch nicht ganz,wie du das meinst ):
-
Andersrum schaffe ich's schon.
for(int offset = sizeof(x) * 8 - 1 ; offset >= 0; --offset){ cout << ((x>>offset) & 0x1);Aber das sizeof kriege ich so nicht weg.
-
Du kannst mit
(x & (1<<n))>>n(Edit: Wobei volkards Lösung besser ist) die n-te Binärziffer von x herausholen. Das mußt du nur noch in deiner Schleife einbauen und kannst je nach Bedarf von oben oder von unten alle Ziffern ausgeben.
(wenn du ohne sizeof auskommen willst, ist es schwieriger die höchste Ziffer der Ausgabe zu bestimmen)Eine Alternative wäre es noch, die Ausgabe erst in einem String zwischenzuspeichern und dann rückwärts wieder auszugeben.
-
Auch sizeof kann ich loswerden, aber dann ist es wieder verdreht.
for(unsigned int maske = 1 ; maske != 0; maske<<=1 ) if(x&maske) cout << 1; else cout << 0;Vielleicht kann man auf recht zuverlässige Weise, ja klar.
for(unsigned int maske = ~0u>>1^~0u; ...
-
klingt beides sehr kompliziert,ich verwende einfach mal meine Lösung inkl. der umgekehrten for Schleife,sollte ausreichen^^
wobei ich doch anstatt sizeof(x)*8-1 auch einfach int offset=32(31?) nehmen könnte oder?
-
Klar könntest du, aber niemand garantiert dir, daß ein int wirklich 32 Bit groß ist.
@volkard: Die letzte Lösung ist wohl ideal - und für einen Anfänger absolut unverständlich

-
CStoll schrieb:
@volkard: Die letzte Lösung ist wohl ideal - und für einen Anfänger absolut unverständlich

Ja, Enfi hat sie schon abgelehnt. *heul*
-
volkard schrieb:
if(x&maske) cout << 1; else cout << 0;cout << !!(x&maske);Wenn wir schon dabei sind

-
naja,so schwer zu verstehen ist es auch nicht

-
Ich schlage Rekursion vor:
#include <iostream> void print_binary(unsigned x) { if(x != 0) { print_binary(x >> 1); std::cout << (x & 1); } }Ansonsten kann man den sizeof-Kram auch durch
std::numeric_limits<unsigned>::digitsersetzen (Header <limits>). Man kann auch wie folgt ein Bit über den int laufen lassen:
void print_binary(unsigned x) { for(unsigned mask = ~(~0u >> 1); mask; mask >>= 1) { std::cout << ((x & mask) ? '1' : '0'); } }Das dürfte etwa das sein, was Volkard sich vorgestellt hat. mit ein bisschen Umstand lässt sich das auch optisch angenehm gestalten (will sagen, ohne führende Nullen):
void print_binary(unsigned x) { unsigned mask = ~(~0u >> 1); for(; (x & mask) == 0 && mask != 0; mask >>= 1); for(; mask != 0; mask >>= 1) { std::cout << ((x & mask) ? '1' : '0'); } }Schlussendlich finden sich hier verschiedene Hacks, das höchste gesetzte Bit schneller zu finden als oben gezeigt; diese sind allerdings plattformabhängig.
Der Sonderfall x == 0 ist trivial ranzupatchen; ich belasse ihn als Aufgabe für den Leser.
