binäre Zuweisung



  • Moinsen Ihr Leute vom Fach!

    Bitte nicht hauen, aber ich suche schon die ganze Zeit eine Möglichkeit einer einfachen Zahl einen binären Wert zuzuweisen. Hex ist das mir schon klar, aber binär? 😕

    int z=b00000001; // geht nicht  :open_mouth:
    


  • das geht bei C++ nicht. Zumindest nicht beim Borländer.

    Da mußt Du schon die hexadezimale oder dezimale Schreibweise verwenden. Andererseits sind Binärzahlen selten hilfreich (wie schnell vergißt man eine Bitstelle!?) und mit Hexadezimalzahlen kann man sich Binärwerte ruck zuck vorstellen (braucht nur etwas Übung).

    Du weißt, ja schon, daß 00000001 = 0x01 ist?

    Wenn Du jedoch viel mit Flags arbeiten willst, kannst Du auch mit Konstanten schaffen. Jedes Flag wird einer Konstanten zugeordnet. Dann wird sofort klar, was man machen will, wenn man die Konstante(n) anstatt der zugehörigen Flags direkt setzt.

    Diese "Bitbeißerei" ist wie gesagt sehr unflexibel und fehleranfällig. Konstante wiederum sind viel sinnvoller. Also gergiß das schnell wieder 😃



  • Vielen Dank für die ausführliche Antwort! Ich komme also nicht umhin mir FLAGS zu definieren.



  • Kannst dich auch mal zum Thema "Bitmasken" schlau machen.



  • Hi,

    int __fastcall BinStrToInt(const AnsiString AValue)
    {
     int Result = 0;
     if (AValue.Length() > sizeof(int) * 8)
      return Result;
     for(int i = 1; i <= AValue.Length(); i++)
      if (AValue[i] == '0' || AValue[i] == '1')
       Result = (Result << 1) + (AValue[i] > '0' ? 1 : 0);
      else
       return 0;
     return Result;
    }
    
    int z = BinStrToInt("000010101");
    
    z == 21
    


  • Hi,

    noch einmal... 🙂

    int z;
    
     asm {
      mov z, 00010101b;
     }
    


  • @Blazek Jaroslav

    Das ist eine sehr gute Idee mit dem Inline-ASS!!



  • Und wie bekomme ich die Bitfolge aus einer String- oder char*-Variablen in die ASM-Anweisung?

    Bzw., woher und in welcher Form bekommt <!> seinen Binärwert?



  • Folgendes:

    int a = BinStrToInt("000010101");
    int z;
    
    asm
    {
       mov z, a;  :D 
    }
    

    bringt:

    [Tasm Fehler] Unit1.asm(274): Illegal memory reference

    😮



  • jo, sind vielleicht beides variablem im, speicher.
    ich mach dann immer

    asm
    {
       mov eax,a
       mov z,eax
    }
    

    der optimierer legt gewöhnlich dann trotzdem die register toll. vermutlich z==eax, dann kann er den entstehenden mov eax,eax glatt wegoptimieren.



  • Ok! Funzt einwandfrei!


Anmelden zum Antworten