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
training:dec2bin:start (war: training:std:atoi:start)
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: training:std:atoi:start
+1 für die Titeländerung
und
+1 für Naums, dass es eine Seite gibt, über deren Titel man diskutieren kann.
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: training:std:atoi:start
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:
Bzw. als String ohne führende Nullen speichern:
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;
}
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
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.
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
truth:
mov r0, #42
mov pc, lr
Re: training:std:atoi:start
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.
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):
Wenn du das wie du es beschrieben hast umwandelst, erhältst du für die bools:
Was genau soll das aussagen?
Code: Alles auswählen
for (int i=0; i<sizeof(int); i++)
{
if (mybin.bin[i]==true)
printf ("1");
else printf ("0");
}
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
Code: Alles auswählen
0 0 0 1
Re: training:std:atoi:start
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...
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
truth:
mov r0, #42
mov pc, lr