short in drei Werte "splitten" (Binärgefrickel)



  • Mit passenden Bitmasken kannst du dir die entsprechenden Teilabschnitte herausschneiden und anschließend mit Bit-Shift zurechtrücken:

    Wert1 = (Eingabe & 0x003F);          // 00000000 00111111
    Wert2 = (Eingabe & 0x07C0)>>6;       // 00000111 11000000
    Wert3 = (Eingabe & 0xF800)>>11;      // 11111000 00000000
    

    (nur aus Neugierde: Das hat nicht zufällig mit Grafik zu tun?)



  • Bitschubserei: Zuerst sorgst Du dafür dass die gewünschten Bits rechts im Speicher stehen (Rechts-Shift), und dann blendest Du die Bits links davon aus (binäres Und).

    Als Beispiel für Wert 1:

    short wert1 = wert; // annahme: wert == 1011010000000000
    wert1 = wert1 >> 10; // Bits 0-5 aus wert stehen jetzt rechts in wert1, also XXXXXXXXXX101101
    wert1 = wert1 & 0x3f; // 0x3f ist 0000000000111111, damit werden die Bits 0-9 von wert1 gelöscht
    

    Voila - in wert1 stehen jetzt die Bits 0-5 aus wert, und zwar ganz rechts 😉

    Für die anderen Werte einfach anders schieben und den Wert zum verunden neu berechnen.



  • Du brauchst dafür, glaube ich, einfach nur UND.

    Wert1 = shortVariable & 0xfc00; // ersten 6 bits von LINKS, da 0xfc00 = (binär)1111110000000000
    

    und so weiter. Hab's jetzt nicht ausprobiert, müsste aber klappen.

    EDIT: Oh, da waren ja 3 schneller als ich. ^^



  • Jo danke, scheint zu funktionieren! 🙂 👍

    CStoll schrieb:

    ...(nur aus Neugierde: Das hat nicht zufällig mit Grafik zu tun?)

    Ja, ich frickel gerade uralte Dateiformate auseinander. In den 90ern wurde noch jedes Bit gespart wo es nur ging. Echt anstrengend, sowas auszulesen 😃



  • Cpp_Junky schrieb:

    Ja, ich frickel gerade uralte Dateiformate auseinander. In den 90ern wurde noch jedes Bit gespart wo es nur ging. Echt anstrengend, sowas auszulesen 😃

    [OT] Wenn Du denkst, dass das nicht mehr so ist, vertust Du Dich: Schau Dir nur mal an, wie HDTV in DVB (h264 als MPEG-Datenstrom) codiert ist. Da ist alles variabel und mit krummen Längen codiert, da war MPEG2 noch übersichtlicher. Und das ist ein halbwegs aktuelles Format.



  • LordJaxom schrieb:

    Cpp_Junky schrieb:

    Ja, ich frickel gerade uralte Dateiformate auseinander. In den 90ern wurde noch jedes Bit gespart wo es nur ging. Echt anstrengend, sowas auszulesen 😃

    [OT] Wenn Du denkst, dass das nicht mehr so ist, vertust Du Dich: Schau Dir nur mal an, wie HDTV in DVB (h264 als MPEG-Datenstrom) codiert ist. Da ist alles variabel und mit krummen Längen codiert, da war MPEG2 noch übersichtlicher. Und das ist ein halbwegs aktuelles Format.

    Klar, bei Formaten die unmengen Daten speichern, wie Videos oder Bilddaten. Aber drei Texturindizes würde heute niemand mehr in einen short quetschen, nur um damit ein Byte zu sparen 😃



  • Cpp_Junky schrieb:

    Aber drei Texturindizes würde heute niemand mehr in einen short quetschen, nur um damit ein Byte zu sparen 😃

    Wer weiß, wieviele Textur-Indizes da in dem Format gespeichert werden sollten 😃
    (btw, mir ist bei den Vorgaben zuerst das 16-Bit Format von BMP in den Sinn gekommen - auch wenn da die Bitverteilung etwas anders ist)



  • Wieso nicht? Wenn man es kann? 😃
    Vor allem wenn man dadurch andere Leute nerven kann, die irgend wann einmal, wenn man selbst keinen Support mehr leisten muss, damit arbeiten müssen. Soviel Spaß muss sein. 😉



  • CStoll schrieb:

    Cpp_Junky schrieb:

    Aber drei Texturindizes würde heute niemand mehr in einen short quetschen, nur um damit ein Byte zu sparen 😃

    Wer weiß, wieviele Textur-Indizes da in dem Format gespeichert werden sollten 😃
    (btw, mir ist bei den Vorgaben zuerst das 16-Bit Format von BMP in den Sinn gekommen - auch wenn da die Bitverteilung etwas anders ist)

    Maximal 32x32, also effektiv hätte man 1 KB gespart 😉



  • Cpp_Junky schrieb:

    Maximal 32x32, also effektiv hätte man 1 KB gespart 😉

    Das war vermutlich zu Zeiten, als Begriffe wie "Gigabyte" noch als Utopie galten 😃


Anmelden zum Antworten