Dez. in Bin. umrechnen!

Gast #4026709
Lesenswert?

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!
Gast #4026720
Lesenswert?

int(main)void
{
   int zahl, dezimal, rest, ergebnis=0, faktor=1;

  printf("***** DEZIMAL ==> BINAER *****");
  printf("\n\nBitte geben sie die Zahl ein, die ins binaere

        Zahlensystem konvertiert werden soll : ");
  scanf("%i", &dezimal);

  zahl=dezimal;

  while (dezimal)
    {
    rest = dezimal % 2;
    dezimal = dezimal / 2;

               faktor *= 10;
     ergebnis = ergebnis + rest * faktor;
    }

  printf ("\n\n %i als binaere Zahl : %i ", zahl, ergebnis);
       return_EXIT SUCCESS;
}
Gast #4026726
Lesenswert?

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.
Gast #4027105
Lesenswert?

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.
Gast #4027108
Lesenswert?

Wie du aber siehst, gehört itoa nicht 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.
Gast #4028308
Lesenswert?

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.
Gast #4028715
Lesenswert?

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 ...
#4028816
Lesenswert?

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
1
void int2bin(char* dst, uint8_t i) {
2
  for (uint8_t j = 0; j < 8; j++ ) {
3
    dst[j] = (i & 0x80) ? '1' : '0';
4
    i <<= 1;
5
  }
6
  dst[8]=0;
7
}
8

9
int main()
10
{
11
  char str[9];
12

13
  int2bin( str, 29 );
14
  printf( "%s\n", str );
15
}
Gast #4035979
Lesenswert?

> 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_t u8shiftLeft(uint8_t value, uint8_t bits)
2
{
3
  switch(bits)
4
  {
5
    case 7: value <<= 1u;
6
    case 6: value <<= 1u;
7
    case 5: value <<= 1u;
8
    case 4: value <<= 1u;
9
    case 3: value <<= 1u;
10
    case 2: value <<= 1u;
11
    case 1: value <<= 1u;
12
    default:
13
  }
14
  return value;
15
}
Schau mal, ohne Schleifen und weitgehend optimal! ;-)
Moderator Persönliche Seite #4035992
Lesenswert?

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? ;-)
Gast #4036005
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren