Aus einem int Bitfolge ausschneiden?



  • Ich möchte aus einem inte eine Bitfolge ausschneiden. Wie macht man das am besten? Ich hab schon diverse Versucht mit Bitverknüpfungen und Shiftoperatoren gestartet, aber nix hat funktioniert. Könnt ihr mir helfen?



  • Was genau willst Du machen?
    Was sind Eingansdaten und was Returnwert der gesuchten Funktion?



  • Im int steht z.B. diese Zahl: 23587912.

    Dieser int soll an die Funktion übergeben werden. Dann soll noch ein Startwert übergeben werden können sowie die Länge wie viel Bits extrahiert werden sollen.

    Die Richtung von dem der Startwert aus "runtergezählt" werden soll so von höherwertig nach niederwertiges Bit gehen.

    Hier schon mal ein Anfang:

    #include<stdio.h>
    
    unsigned int extract(unsigned int zahl, int start, int laenge)
    {
    	unsigned int slice, maske = 1;
    
    	maske = maske << start;
    
    return slice;
    }
    
    int main()
    {
    	unsigned int zahl = 23587912, start = 9, laenge = 4;
    
    	extract(zahl, start, laenge);
    
    return 0;
    }
    

    So stell ich mir das vor



  • Gib doch mal ein Beispiel mit Werten.
    Was soll denn dein extract() in deinem Beispiel zurückgeben?



  • Also die Bitfolge sieht nun so aus: 1011001111110110001001000

    Wenn ich nun bei start z.b. eine 13 stehen habe und in laenge eine 4, dann soll er mir vom 13. bit an richtung abwärts 4 bits extrahieren.

    Ich hab mal so weitergemacht:

    #include<stdio.h>
    
    unsigned int extract(unsigned int zahl, int start, int laenge)
    {
    	unsigned int slice, maske = 0, val = 1;
    
    	for(int i=start; i>=laenge; laenge--)
    	{
    		maske = maske | (val << (start-i));
    	}
    
    return slice;
    }
    
    int main()
    {
    	unsigned int zahl = 23587912, start = 9, laenge = 4;
    
    	extract(zahl, start, laenge);
    
    return 0;
    }
    

    Die for-Schleife soll mir quasi eine Maske erzeugen mit genau an den Stellen mit 1en, die quasi die Bits angeben, die später dann durch ein oder aus der zahl extrahiert werden sollen. Versteht ihr?



  • Soll der Rückgabewert dann 15 oder 491520 sein?



  • int extract(unsigned int zahl, int start, int laenge)
    {
        //zahl  = 23587912 
        //zahl  = 1011001111110110001001000
        //start = 9
        //länge = 4
        //m4    = 1111111111111111111000000 = ~0u<<(start-laenge+1)
        //m3    = 1111111111111110000000000 = ~0u<<(laenge+1)
        //m2    = 1111111111111110000111111 = m3 & ~m4
        //maske = 0000000000000001111000000 = ~m2
        //slice = 0000000000000000001000000 = zahl & maske
        return /*im prinzip gelöst*/;
    }
    


  • vip@r schrieb:

    Also die Bitfolge sieht nun so aus: 1011001111110110001001000
    Wenn ich nun bei start z.b. eine 13 stehen habe und in laenge eine 4, dann soll er mir vom 13. bit an richtung abwärts 4 bits extrahieren.

    Immernoch massiv uneindeutig.

    Die Bitfolge sei
    zahl = 0000000abcdefghijklmnopqrstuvwxy
    und
    start = 9
    länge = 4

    Was ist die Ausgabe?



  • Ich denke das Problem kann nicht gelöst werden, ohne sowohl sizeof(int) als auch size_in_bit(byte) festzulegen.



  • cooky451 schrieb:

    Ich denke das Problem kann nicht gelöst werden, ohne sowohl sizeof(int) als auch size_in_bit(byte) festzulegen.

    Mit size_in_bit(byte) meinst du wohl CHAR_BIT aus limits.h



  • DirkB schrieb:

    Mit size_in_bit(byte) meinst du wohl CHAR_BIT aus limits.h

    Ne, im Nachhinein meinte ich gar nichts. 🙄
    Trotzdem werde ich das Gefühl nicht los, etwas unsinniges gemacht zu haben.. Jetzt geht's..

    unsigned int ex(unsigned int val, unsigned int start, unsigned int len)
    {
      int t = 1 << ((sizeof(int) * CHAR_BIT) - 1);
      t >>= start - 1;
      val &= ~t;
      t ^= t >> len;
      return t & val;
    }
    

    //Edit: Kleine Änderung. 🙂


Anmelden zum Antworten