Hallo,
würde gerne Dez-Zahlen in Binär umrechnen und bin jetzt schon eine weile
am suchen. Also ich suche eine einfache Fkt. wie eine art Typumwandlung.
Wo kann ich so was am besten nachschlagen und gibt es da quasi eine
Standart Bib. oder muss ich das über eine selbst geschriebene Formel
Realisieren?
Fussnote: Selber Programmiert hab ich es schon und es geht. Dachte nur
es gibt das schon was vorgefertiges.
Viele Grüße!
Klaus schrieb:> Fussnote: Selber Programmiert hab ich es schon und es geht. Dachte nur> es gibt das schon was vorgefertiges.
dann zeige mal was du gemacht hast, denn es ist nicht ganz klar was du
meinst.
aso, ich will von 0 bis 255 in einer for-schleife hochzählen und das
quasi die zwischen schritte immer umrechnen. Also:
0 = 0000 0000
1 = 0000 0001
...
ich suche quasi so etwas wie eine einfachen Prefix der aus der 255 von
mir aus eine 1111 1111 macht. Also so was wie i = (inbin)255; .. oder so
in der Art :D. wenns das nicht gibt nicht so wild dann mach ichs über
die "große" Fkt.
Klaus schrieb:> ich suche quasi so etwas wie eine einfachen Prefix der aus der 255 von> mir aus eine 1111 1111 macht.
was soll denn 1111 1111 sein? Ein string?
gibts da eine gute Seite auf der man diese Fkt. also wie itoa usw.
nachlesen kann? das was ich bis jetzt dazu immer gefunden hab fand ich
nicht so super :/
Dir scheint nicht ganz klar zu sein dass sowohl eine dezimale als auch
binäre Zahl immer noch das gleiche sind: Eine Zahl.
Binär und dezimal verändert lediglich die Darstellungsweise, nicht aber
den Wert der Zahl.
Wie du die Zahl nun entsprechend darstellen kannst wurde ja bereits
gezeigt.
Wie du aber siehst, gehört itoanicht zum Standard.
Es gibt auch verschiedene Versionen davon (mit und ohne Angabe der
Basis).
Im Standard gibt es keine Funktion dafür.
Umgekehrt kannst du strtol nehmen.
Wenn du nur deine Funktion überprüfen willst, kannst du dein Ergebnis
mit strtol wieder zurückwandeln und dann prüfen.
Klaus schrieb:> ich suche quasi so etwas wie eine einfachen Prefix der aus der 255 von> mir aus eine 1111 1111 macht. Also so was wie i = (inbin)255; .. oder so> in der Art :D. wenns das nicht gibt nicht so wild dann mach ichs über> die "große" Fkt.
Die 255 ist erstmal eine Zahl. Intern speichert der Computer diese
grundsätzlich immer im Dualsystem, denn was anderes kennt er dafür gar
nicht. Also ob du jetzt
1
x=12;
oder
1
x=0xC;
schreibst, macht erstmal keinen Unterschied. Aus beidem macht der
Compiler exakt den gleichen Code, und auch der in x gespeicherte Wert
ist genau gleich, und man kann ihm nachher nicht mehr ansehen, wie es
bei der Zuweisung angegeben war.
Erst, wenn du den Wert ausgeben willst, muss daraus ein String, also
Text erzeugt werden, und dort kann die Darstellung dann unterschiedlich
gemacht werden.
wie wärs mit sowas ...
unsigned char s[9];
void int2bin(char* dst, int i) {
for (int j=0;j<8;j++) {
s[j]=(i & (7-0)) ? '1' : '0';
}
s[8]=0;
return dst;
}
printf("%i -> %s", 123, int2bin(s, 123));
man schiebt einen int rein und bekommt einen nullterminierten string
raus ...
mampf schrieb:> ups sollte natürlich s[j]=(i & (2<<(7-j))) ? '1' : '0';
immer noch falsch.
> heißen ... aber> weiß ja bestimmt jeder, was gemeint ist ...
Ein Neuling weiss aber nicht, was gemeint ist.
Ganz abgesehen, dass variable Shifter nichtgewollt sind. Wenn schon dann
so
mampf schrieb:> Warum sind variable Shifter nicht gewollt? ;)
Weil ein AVR mangels geeigneter Hardware ("Barrel-Shifter") jeden
einzelnen Shift in einer Schleife machen muss. Das dauert einfach -
abgesehen vom erhöhten Flash-Verbrauch.
> Weil ein AVR mangels geeigneter Hardware ("Barrel-Shifter")> jeden einzelnen Shift in einer Schleife machen muss. Das> dauert einfach - abgesehen vom erhöhten Flash-Verbrauch.
1
uint8_tu8shiftLeft(uint8_tvalue,uint8_tbits)
2
{
3
switch(bits)
4
{
5
case7:value<<=1u;
6
case6:value<<=1u;
7
case5:value<<=1u;
8
case4:value<<=1u;
9
case3:value<<=1u;
10
case2:value<<=1u;
11
case1:value<<=1u;
12
default:
13
}
14
returnvalue;
15
}
Schau mal, ohne Schleifen und weitgehend optimal! ;-)
Ausgeloggt schrieb:> Schau mal, ohne Schleifen und weitgehend optimal! ;-)
Wenn Du - wie Karl Heinz - eine Maske mitführst, dann muss ein Wert pro
Schleifendurchlauf nur einmal geschoben werden - also ingesamt 8 mal.
Wenn Du für jeden Schleifendurchlauf stattdessen Deine Funktion
aufrufst, wird - je nach Wert von "bits" - 0 bis 7 mal geschoben. Macht
in der Summe 0+1+2+3+4+5+6+7 = 28 mal.
Was meinst Du, was effektiver ist? ;-)
Frank M. schrieb:> Wenn Du - wie Karl Heinz - eine Maske mitführst, dann muss ein Wert> pro Schleifendurchlauf nur einmal geschoben werden - also ingesamt> 8 mal.
Na so was ;-) Stimmt. Habe ich in meinem Enthousiasmus übersehen.
> Was meinst Du, was effektiver ist? ;-)
Das alles liegen lassen und einfach printf("%0X", ...) benutzen.
Und wer das nicht im Kopf in binär übersetzen kann, soll es lernen! :-P