Aus zwei Zahlen eine binäre erzeugen



  • Hallo,

    habe zwei Zahlen n1, n2. Jede Zahl steht für ein Nibble, wobei n1 niederwertig und n2 höherwertig ist. Wie kann ich diese beiden Zahlen zu einer binären Zahl "verbinden"?

    Beispiel:

    n1 = 6 = 0110
    n2 = 9 = 1001

    -> 1001 0110 = 150

    Ein einfaches XOR-Verknüpfen geht natürlich nicht. Vielleicht steht ich auch nur auf dem Schlauch.

    Danke!



  • (n2 << 4) + n1

    dabei wird n2 um 4 bits nach links verschoben und mit nullen aufgefüllt
    -> 10010000



  • Ahh, hatte es nun auch rausgefunden. Vielen Dank trotzdem :).



  • bitshifter schrieb:

    (n2 << 4) + n1

    dabei wird n2 um 4 bits nach links verschoben und mit nullen aufgefüllt
    -> 10010000

    Lieber

    (n2 << 4) | n1
    

    Addieren könnte je nach Zieltyp Probs machen, hinein- Odern ist die native Operation. 😉



  • Bit-Shifting geht zwar schneller, aber über ne union sollte es eigentlich auch zu lösen sein - steinigt mich, wenn ich falsch liege 🙂



  • Xantus schrieb:

    Bit-Shifting geht zwar schneller, aber über ne union sollte es eigentlich auch zu lösen sein - steinigt mich, wenn ich falsch liege 🙂

    Welcher Datentyp war gleich nochmal 4 Bit breit?



  • pointercrash() schrieb:

    Lieber

    (n2 << 4) | n1
    

    Addieren könnte je nach Zieltyp Probs machen, hinein- Odern ist die native Operation.

    oder so

    (n2 << 4) | (n1 & 0x0f)
    

    🙂



  • Nanyuki schrieb:

    Xantus schrieb:

    Bit-Shifting geht zwar schneller, aber über ne union sollte es eigentlich auch zu lösen sein - steinigt mich, wenn ich falsch liege 🙂

    Welcher Datentyp war gleich nochmal 4 Bit breit?

    Oh, pardon. 🙂



  • typedef struct
    {
        unsigned _Nibble1  : 4;
        unsigned _Nibble2  : 4;
    }Einzelnibbles;
    
    union
    {
        Einzelnibbles E;
        unsigned char A;
    }AllesZusammen;
    

    Meinst du so was in der Art?



  • @Babbage&Xantus: Klar, funzt! 🙂

    Hab' jetzt beide Versionen durch'n Compiler geschoben, auf 'nem 16-BITter unterscheidet sich der ASM- Output bei voller Optimierung nur marginal, das Bitfield wird auch mit Shifts angesprochen.

    Der Tippaufwand rentiert sich also nur, wenn man mit den Nibbles mehr unternehmen mag, als sie einmal zusammenzubasteln 😉



  • hätte nich gedacht das diese geht mit den bitfeldern, durch padding...



  • BorisDieKlinge schrieb:

    hätte nich gedacht das diese geht mit den bitfeldern, durch padding...

    Wieso nicht? Bitfield ist Bitfield, das darf das Compilat nicht zerstören. 😃
    Padding und die reale Abbildung auf Bits und Bytes müssen Dich erst interessieren, wenn Du auf Hardware direkt zugreifst, logisch auf Sprachebene bleibt es aber immer konsistent.



  • Babbage schrieb:

    typedef struct
    {
        unsigned _Nibble1  : 4;
        unsigned _Nibble2  : 4;
    }Einzelnibbles;
    

    darauf, dass das nicht grösser als 8 bits wird, würde ich mich nicht verlassen.
    🙂



  • fricky schrieb:

    darauf, dass das nicht grösser als 8 bits wird, würde ich mich nicht verlassen.

    eben.. das meinte ich pointer crash 🙂



  • BorisDieKlinge schrieb:

    eben.. das meinte ich pointer crash 🙂

    Ahja, stimmt! Bin durch meine embedded- Compiler verwöhnt, die warnings ausgeben, wenn sie kein byte- alignment hinkriegen. 😉
    Ihr habt recht, Standard ist das nicht, daß Bitfields wirklich bitweise im Speicher einsortiert werden. Zu meiner Entschuldigung muß ich aber anführen, daß es mir in der Praxis nie anders untergekommen ist 🙄 .



  • kein problem;) oder arbeitest du mit nem 4Bit- cpu^^



  • BorisDieKlinge schrieb:

    kein problem;) oder arbeitest du mit nem 4Bit- cpu^^

    Ne, erstmal brauch' ich vier Bit, um mich an krude CPUs zu setzen. 😃
    Ohne Witz, die gibt's tatsächlich (SuperLowPowerLowCost von Mitsubishi, heute Renesas), mußte mal was für so eine Kiste machen, allerdings in Assembler und laaange her.
    Gottseidank 😉


Log in to reply