BITS einer LONG-Variablen als Array zurückliefern....



  • Hallo Leute,

    ich muss eine Ganzzahl in ein Array seiner gesetzten Bits umwandeln.
    Mehrere Anläufe sind erfolgreich, aber nicht performant genug.

    Kann ich so was ohne Schleifenbildung machen?

    Beispiel:
    Ganzzahl: 22
    Bitmuster: 00010110
    Geünschtes Array: 16,8,4 um die gesetzten Bits zu zeigen.
    Hier geht es um eine I/O wo ich auf einem 32 Bit Bus Signale bekomme, die ich trennen muss. Schleifendurchläufe sind zu langsam, da ich das alle 10ms machen muss.

    Wer hat eine schnelle performante Idee?

    cu s00n
    J.S.



  • Unterhalb von Bytes mußt du alles selber programmieren, d.h. dir bleibt nichts anderes übrig, als mittels einer Schleife die gesetzen Bits zu extrahieren (ich denke auch nicht, daß dies das Geschwindigkeitsproblem ist). Wahrscheinlich ist die Erzeugung des Arrays zu langsam...
    Zeig doch mal etwas Code...



  • Kannst auch ne lookup-table anlegen, dann kannst du die anzahl der durchläufe verkleinern (wenn du sie mit 256 werten füllst brauchst du nur mehr 4 durchläufe anstatt 32).
    Aber wie gesagt, denke auch nicht das die schleife das problem ist, ein bit-shift ist nicht sonderlich rechenintensiv



  • Ich glaube nicht, daß eine Lookup-Table hier hilft, da ja ein Array der gesetzten Bits erzeugt werden muß, d.h. die Lookup-Table-Einträge müßten selber Arrays sein, welche dann wiederum kopiert werden müßten etc.

    Einzig ein statisches Array (ohne dynamische Allokierung) bringt Geschwindigkeit...



  • Th schrieb:

    Ich glaube nicht, daß eine Lookup-Table hier hilft, da ja ein Array der gesetzten Bits erzeugt werden muß, d.h. die Lookup-Table-Einträge müßten selber Arrays sein, welche dann wiederum kopiert werden müßten etc.

    Einzig ein statisches Array (ohne dynamische Allokierung) bringt Geschwindigkeit...

    Hmmm... kannst mir ein Beispiel zeigen?



  • ich meine z.B.

    static int Array[32];
    

    anstatt

    ArrayList array = new ArrayList();
    array.Add(x);
    

    Ich weiß aber immer noch nicht wofür du das Array brauchst (und in welcher Form)?



  • andere Frage, warum muß es ein Array sein? Es geht doch nur darum sagen zu können das z.B. bit 4 1 oder 0 ist, oder?

    class bitmuster
    {
        int mEingabe;
    
        public bitmuster(int eingabe)
        {
            mEingabe = eingabe;
        }
    
        public bool this[int index]
        {
            get
            {
                return (bool)((mEingabe & (index * 2)) != 0);
            }
        }
    }
    

    Anwendung sieht dann so aus:

    bitmuster bit = new bitmuster(0xef);
    
       bool b1 = bit[0];
       bool b2 = bit[1];
       bool b3 = bit[2];
    


  • Servus,

    wie immer führen viele Wege nach Rom.

    Meine Standardanwendungen:

    // Entweder so
    
    int val = 0x08;
    
    BitArray bitArray = new BitArray( BitConverter.GetBytes(val) );
    
    bool bit0 = bitArray[0];
    bool bit1 = bitArray[1];
    bool bit2 = bitArray[2];
    bool bit3 = bitArray[3];
    
    // Oder so
    
    bit0 = ((val & 0x01) == 0x01 ? true : false);
    bit1 = ((val & 0x02) == 0x02 ? true : false);
    bit2 = ((val & 0x04) == 0x04 ? true : false);
    bit3 = ((val & 0x08) == 0x08 ? true : false);
    

    mfg
    Hellsgore


Anmelden zum Antworten