Seite 1 von 1

training:dec2bin:start (war: training:std:atoi:start)

Verfasst: Sa Jan 18, 2014 3:09 pm
von nufan
http://www.proggen.org/doku.php?id=trai ... atoi:start
Ich finde ehrlich gesagt den Titel sehr verwirrend, da die atoi() Funktion eigentlich etwas ganz anderes macht.

EDIT:
Neuer Link: http://www.proggen.org/doku.php?id=trai ... 2bin:start

Re: training:std:atoi:start

Verfasst: Sa Jan 18, 2014 4:45 pm
von Xin
+1 für die Titeländerung
und
+1 für Naums, dass es eine Seite gibt, über deren Titel man diskutieren kann.

Re: training:std:atoi:start

Verfasst: So Feb 16, 2014 3:10 pm
von nufan
Hab mir das jetzt erst genau durchgelesen und irgendwie passt das inhaltlich nicht ganz. Wieso ein Union von int und einem char-Array? Dann kann ich den Integer etwas leichter pro Byte auslesen, das stimmt. Trotzdem will ich ja pro Bit auslesen und da erleichtert mir das Union die Arbeit nicht wirklich. Das Union hat auch nicht eine Größe von sizeof(int) sondern sizeof(int) * 8 Byte.

Meine Lösung würde so aussehen:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char *argv[] )
{
  if( argc != 2 )
      return 1;

  int a = atoi( argv[1] );
  unsigned int bin = 1 << ( sizeof( int ) * 8 - 1 );

  do { printf( "%c", '0' | ( ( a & bin ) > 0 ) ); } while( bin >>= 1 );
  printf( "\n" );

  return 0;
}
Bzw. als String ohne führende Nullen speichern:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

int main( int argc, char *argv[] )
{
  if( argc != 2 )
      return 1;

  int a = atoi( argv[1] );
  char t[sizeof( a ) * 8 + 1] = { '\0' };
  char *p = &( t[sizeof( t ) / sizeof( t[0] ) - 1] );

  do { *(--p) = '0' | ( a & 0x1 ); } while( a >>= 1 );
  printf( "%s\n", p );

  return 0;
}

Re: training:std:atoi:start

Verfasst: Do Feb 20, 2014 6:07 pm
von naums
ich bin grad etwas verwirrt, was die Codebeispiele tun sollen...

Das Union sollte hier als Beispiel dienen, dass ein Union mit int und bool gebraucht wird, wollte ich hier nicht verraten. Interessanterweise funktioniert das bei meinen Probeläufen nicht, daher steht der Code auf der Lösungsseite auch in nem HTML-Kommentar. (oder garnicht drin).

Wenn das verwirrend ist, dann änder ich das mal (tm) entsprechend ab.

Re: training:std:atoi:start

Verfasst: Fr Feb 21, 2014 7:26 pm
von nufan
Ich versteh nicht was du mit dem Union anfangen willst... du wandelst hier ein int in mehrere bools um und gibst dann deren Wahrheitswert aus.

Code: Alles auswählen

    for (int i=0; i<sizeof(int); i++)
    {
        if (mybin.bin[i]==true)
            printf ("1");
        else printf ("0");
    }
Aber die bools sind doch jeweils ein Byte des int, nicht ein Bit?!
Angenommen die Zahl 7. Integer (ohne Berücksichtigung von Big/Little Endian, das ist jetzt mal egal):

Code: Alles auswählen

00000000 00000000 00000000 00000111
Wenn du das wie du es beschrieben hast umwandelst, erhältst du für die bools:

Code: Alles auswählen

0 0 0 1
Was genau soll das aussagen?

Re: training:std:atoi:start

Verfasst: Fr Feb 21, 2014 7:39 pm
von naums
Genau das war mir auch aufgefallen. Ich dachte aber man koenne das so machen. Vor allem dachte ich dass ein bool ekn bit groß ist... Aber das scheibt so tatsaechlich nicht zu stimmen. ...

Was ich damit eigentlich machen wollte war, jedes bit des ints auszulesen und auszugeben, aber das scheint so nicht zu gehen. Nach den pruefungen setz ich mich da nochmal ran...