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

Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
Antworten
nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

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

Beitrag von nufan » Sa Jan 18, 2014 3:09 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: training:std:atoi:start

Beitrag von Xin » Sa Jan 18, 2014 4:45 pm

+1 für die Titeländerung
und
+1 für Naums, dass es eine Seite gibt, über deren Titel man diskutieren kann.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: training:std:atoi:start

Beitrag von nufan » So Feb 16, 2014 3:10 pm

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;
}

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: training:std:atoi:start

Beitrag von naums » Do Feb 20, 2014 6:07 pm

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.
.globl truth
truth:
mov r0, #42
mov pc, lr

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: training:std:atoi:start

Beitrag von nufan » Fr Feb 21, 2014 7:26 pm

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?

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: training:std:atoi:start

Beitrag von naums » Fr Feb 21, 2014 7:39 pm

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...
.globl truth
truth:
mov r0, #42
mov pc, lr

Antworten