OKTALZAHL.CPP



  • Hey... das waren ja super schnelle Antworten. Vielen Dank... 🙂 So halb hab ich es jetzt mal verstanden wie es funktionieren sollte. In meiner Mittagspause mach ich mich sofort mal an die Aufgabe ran... *g*



  • Hey Ihr.... ich moechte mich nochmal fuer eure Hilfe wegen der Dateirechte bedanken. Also das mit den Binärzahlen ins rwx format umrechnen versteh ich mal. Nun komm ich aber leider trotzdem nicht weiter.

    Gehen wir mal davon aus, die eingegebene Zahl ist

    444 in Binärzahl waere es ja dann 100100100 😃

    aber wie kann ich die 444 mit C++ umwandeln in Binär??

    Gibt es da eine Formel?? 😕 Oder muss ich mir da eine eigene Funktion schreiben? Es waere super, wenn mit vielleicht jemand ein Codebeispiel fuer die erste Zahl schreiben koennte, weil sonst komm ich leider auf keinen gruenen Zweig :o



  • Bitmasken sind dir ein Begriff? Wenn nicht, sags, dann werd ich eine etwas längere Abhandlung darüber schreiben (o:

    Schau dir mal den Operator & (als Bitweisen Operator) an. Damit kann man ganz Einfach logische AND-Verknüpfungen bauen.

    -junix



  • Und beachte mein Geschreibsel, vor allem den ersten Satz. Ich denke mal, dann tust Du Dir viel leicher.



  • Stimmt Peter hat ja eigentlich bereits darüber geschrieben wie die maskiererei funktioniert (o:

    Vielleicht noch ergänzend: Wenn du die Maske als Variable gestaltest, kannst du bequem und elegant mittels "shiften" (schieben) der Bits (<< ) die Maske aktualisieren. (o:

    -junix



  • Ich schaem mich schon langsam zu fragen... 🙄

    Also Bitmasken waeren also z.B. folgende

    ios::out Schreibmodus (Default für ofstream)
    ios::app Append -- Anhängemodus, Schreiben an das Dateiende
    ios::ate AtEnd -- automatische Positionierung an das Dateiende
    ios::binary Binärmodus

    und ich muesste mich dann auf die binary beziehen, aber ich habs leider
    immer noch nicht ganz verstanden. Irgendwie ist es nicht so ganz mein
    Lieblingsfach 😉

    Ein kleiner Denkanstoss oder besser gesagt noch ne kleine Hilfe waere super
    mega nett von euch 😃



  • Original erstellt von Cupdiffusor:
    Also Bitmasken waeren also z.B. folgende

    ääääh nein.

    Kleine Theorie über das Maskieren
    Maskieren (im programmiertechnischen Sinne) hat grundätzlich nichts mit Karneval zu tun. Soviel leuchtet glaub ich jedem ein (o: Maskieren nennt man das Ausblenden bestimmter Bits aus einem Binärhaufen.

    Beispiel
    Wenn ich einen Wert habe wie zum Beispiel 0x05 (Bin: 0000 0101) und ich will sehen ob das 1-Wertige Bit gesetzt ist, dann stört mich das 4-Wertige Bit doch etwas. Hier kann man sich eben mit binären Operationen behelfen.
    Wenn wir folgende Rechnung ausführen, sind wir alle Bits bis auf das, das wir prüfen wollten los:

    0000 0101
    (bin. AND) & 0000 0001
               -----------
                 0000 0001
    

    Wäre das 1-Wertige Bit nicht gesetzt, wäre das Ergebnis null.

    Schön und gut, aber wie wende ich das jetzt an?
    Wenn du die Werte die du überprüfen musst nun einliest, und alle Bits bis auf das das dich interessierst ausblendest, dann gibt es 2 Möglichkeiten wie das Resultat ausfällt: Entweder das Ergebnis ist 0 (Bit war nicht gesetzt, die anderen wurden fürs Ergebnis gelöscht, also 0) oder das Ergebnis ist n (abhängig von der Wertigkeit des Bits). Man kann also in einer if-Anweisung bequem überprüfen ob das Bit gesetzt ist oder nicht.

    -junix



  • Was ich vergass: deine eingangszahl musst du eben Ziffer für Ziffer von string nach int (oder char) wandeln um das machen zu können. (Wie ich es oben schon erwähnt hatte).

    Ahja und Nachfragen ist kein Grund sich zu schämen. Schämen sollte man sich erst ab dem punkt ab dem man nur noch nach "kann jemand bitte die Lösung posten?" fragt (o:

    Wenn etwas unklar ist, ungeniert weiter fragen... wer nicht fragt bleibt dumm (o;

    -junix



  • @junix
    Wenn man mit einzelnen Ziffern arbeitet (Subroutine wie von mir angedacht) muß man garnix umwandeln sondern kann sofort mit dieser Ziffer als char arbeiten. Das untere Nibble entspricht ja schon der entsprechenden Binärzahl und das obere Nibble, konstant 3 (0011), stört nicht weiter da man nur die 3 Masken 1 (0001), 2 (0010) und 4 (0100) benutzt und damit ausmaskiert wird.



  • Stimmt, daran hatte ich gar nicht gedacht (o:

    -junix



  • Also ich hab die Lösung 😃

    und ich moechte mich recht herzlich fuer eure Hilfe bedanken.
    Fuer jeden, den die Lösung interessiert poste ich sie natuerlich 😉

    ich hoff mal, dass ich ihn richtig gepostet hab.... *g* Hab noch nie nen code gepostet 😉

    Lg
    cuPI



  • So nun noch ein Lösungspost Versuch *g*

    #pragma hdrstop
    #include <stdlib.h>
    #include <iostream.h>
    #include <conio.h>
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
    char import[2];
    char binary[8];
    int multipl = 0;
    cout << "Rechte (in nummer): ";
    cin >> import;
    for(int i = 2; i >= 0; i--)
    {
     switch (import[i])
     {
      case '7':
       binary[0+multipl] = '1';
       binary[1+multipl] = '1';
       binary[2+multipl] = '1';
       break;
      case '6':
       binary[0+multipl] = '0';
       binary[1+multipl] = '1';
       binary[2+multipl] = '1';
       break;
      case '5':
       binary[0+multipl] = '1';
       binary[1+multipl] = '0';
       binary[2+multipl] = '1';
       break;
      case '4':
       binary[0+multipl] = '0';
       binary[1+multipl] = '0';
       binary[2+multipl] = '1';
       break;
      case '3':
       binary[0+multipl] = '1';
       binary[1+multipl] = '1';
       binary[2+multipl] = '0';
       break;
      case '2':
       binary[0+multipl] = '0';
       binary[1+multipl] = '1';
       binary[2+multipl] = '0';
       break;
      case '1':
       binary[0+multipl] = '1';
       binary[1+multipl] = '0';
       binary[2+multipl] = '0';
       break;
      case '0':
       binary[0+multipl] = '0';
       binary[1+multipl] = '0';
       binary[2+multipl] = '0';
       break;
      }
     multipl = multipl + 3;
     }
    
    cout << "-";
    
    for(int i = 8; i >= 0; i--)
    {
     if(i == 8 || i == 5 || i == 2)
     {
      if (binary[i] == '1')
       cout << "r";
      else
       cout << "-";
     }
     if(i == 7 || i == 4 || i == 1)
     {
      if (binary[i] == '1')
       cout << "w";
      else
       cout << "-";
     }
     if(i == 6 || i == 3 || i == 0)
     {
      if (binary[i] == '1')
       cout << "x";
      else
       cout << "-";
     }
    }
    getch();
    return 0;
    }
    


  • Hmmmm Denk mal über eine Lösung nach, die _keine_ switch benötigt...

    als Hilfe geb ich dir mal folgenden Rahmen:

    2 for schleifen
    3 if abfragen

    Variablen beliebig. Empfohlen wird die Verwendung eines std::string. Ahja und was du ja gar nicht verwendet hast ist die Technik der Maskierung... Die wird in dem was ich grad im Kopf hab intensiv genutzt (o;

    Denk darüber nach was Peter über das "umwandeln" gepostet hat. Deine Lösung funktioniert zwar, ist aber etwas hmmm ich sag mal sperrig (o:

    -junix

    [ Dieser Beitrag wurde am 28.05.2003 um 13:15 Uhr von junix editiert. ]



  • Irgendwie hast schon recht 😃 Is schon ein wenig "sperrig" *g*

    Ich hab die Technik mit der Maskierung nicht angewandt, weil ich sie
    irgendwie nicht richtig verstanden hab.... 😕

    Aber ich denk aufjedenfall darueber nochmal nach. Die Lösung in deinem
    vorgegebenen Rahmen waere natuerlich um einiges kleiner :p



  • Original erstellt von Cupdiffusor:
    Ich hab die Technik mit der Maskierung nicht angewandt, weil ich sie
    irgendwie nicht richtig verstanden hab.... 😕

    Beispiel einer Maskierung:

    char byte_char = '1'; // ASCII-Wert von 1 ist 0x31
    if ((byte_char & 0x01) != 0) // Wenn das 1-Wertige Bit gesetzt ist
        do_something();
    else
        do_something_else();
    

    Wie Peter ja richtig bemerkt hat, zeigt ein Blick auf die ASCII-Tabelle, dass die Zeichen 0 - 9 im Bereich 0x30-0x39 angesiedelt sind. Deshalb kann man hier sogar auf die Umwandlung vom Zeichen in eine Zahl verzichten. Du kannst das Selbe Beispiel aber auch machen, wenn du statt '1' einfach 0x01 zuweist.

    Spiel mal etwas mit obigen Snippet. Schau an, was passiert, wenn du unterschiedliche Zahlenwerte für byte_char angibst und vergleich mal mit dem Bitmuster. Im obigen Beispiel ist jetzt eben 0x01 die "Maske".

    -junix

    [ Dieser Beitrag wurde am 28.05.2003 um 13:34 Uhr von junix editiert. ]



  • Hab mich jetzt doch mal schnell hingesetzt und so aus eigenem Interesse heraus versucht den Code etwas zu straffen. Ausserdem möchte ich Dir zeigen, wie man so ein Thema angehen könnte um sich viele Codezeilen zu sparen. Für 3 Bitmasken mag Deine Vorgehensweise ja noch in Ordnung sein, aber wenn es mehr werden sollten 🙄 Mahlzeit 😉
    Ich habe jetzt nur mal den reinen Code abgedruckt und die includes weggelassen. Das Array 'import' hab ich extra etwas größer dimensioniert damit es nicht gleich kracht, sollte man mal mehr als nur 3 Ziffern eingeben. Das Ganze soll ja aber auch nur als Beispiel dienen.

    int main(int argc, char* argv[])
    {
        int x, len;
        char import[32];
    
        cout << "Rechte (in nummer): ";
        cin >> import;
    
        len=strlen(import);
        for(x=0; x<len; x++)
            PrintRights(import[x]);
    
        getch();
        return 0;
    }
    //---------------------------------------------------------------------------
    void PrintRights(char c)
    {
        char mask=4;
        char *rights="-xw-r";
    
        for(int x=0; x<3; x++, mask>>=1)
            cout << rights[c & mask];
    }
    

Anmelden zum Antworten