Bitoperationen und mengen



  • Eine leere Menge hast du doch gerade so definiert, daß alle Bits auf 0 gesetzt werden, d.h. du brauchst jetzt nur ein memset(s, sizeof(Set), 0) aufzurufen (d.h. alle Bytes mit Nullen zu belegen) oder selbst eine Schleife schreiben.

    Und der Zugriff passiert mit den Bit-Operatoren:

    n & (1<<x); // Test, ob Bit x gesetzt
    

    Du mußt jetzt nur auf das richtige Element zugreifen.
    Sei 'nElem' dein Zähler innerhalb der Menge (als unsigned char-Array), dann ist:

    n = nElem/8;
    x = nElem%8;
    

    Schau dir mal ansonsten die Bit-Operatoren in einem C-Buch/Tutorial an, um weitere Mengenoperationen zu definieren (Löschen, Setzen etc. einzelner Bits).



  • Bin auch am rumschieben mit den Bitops!

    Ich habe eine Frage bezüglich des löschens eines Bits in einem Byte!

    Wenn man jetzt z.B soetwas hat...

    ......0010 0100
    20<--------->27
    und man moechte jetzt das Bit an der Stelle 2^2 loeschen also auf Null setzen!
    Wie kann man soetwas machen?????

    Per shifting dürfte das doch nicht gehen oder???
    (Hab da nämlich mal gelesen das durch das shiften ein Element was verschoben wird, die Elemente über die man geht 0 gesetzt werden)



  • Schau dir mal ansonsten die logischen Operatoren in einem C-Buch/Tutorial an

    Die logischen brachst du nicht, du brauchst die bitweisen.

    und man moechte jetzt das Bit an der Stelle 2^2 loeschen also auf Null setzen!

    Am einfachsten eine Maske ...11111101 nehmen, und die mit AND (Operator &) mit dem Bitfeld verknüpfen. Das löscht genau die Bits, die in der Maske auf 0 gesetzt sind.

    Wenn dir das alles zu kompliziert wird, kannst du auch die (selten verwendete) Bit-Feld-Syntax verwenden:

    struct {
        unsigned bit1 : 1;
        unsigned bit2 : 1;
        // usw.
    } var;
    // dann kannst du auf die Bits mit der Struktur-Syntax zugreifen:
    var.bit1 = 1;
    // usw.
    


  • Thes-One schrieb:

    Wenn man jetzt z.B soetwas hat...
    ......0010 0100
    20<--------->27
    und man moechte jetzt das Bit an der Stelle 2^2 loeschen also auf Null setzen!
    Wie kann man soetwas machen?????

    x &= ~(1<<2); /* löscht bit an der stelle 2^2 */
    x &= ~(1<<3); /* löscht bit an der stelle 2^3 */
    /* usw... */
    

    🙂



  • Und wie kann man 2 Mengen auf gleichheit prüfen?
    arbeite hier auch grade an Bitoperationen...

    kann man einfach abfragen?

    if( MengeA == MengeB){
    .....
    }

    denke mal eher nicht odeR?

    MFG



  • kommt drauf an, wie deine 'mengen' aufgebaut sind.
    🙂



  • ist so wie bei C_Neuling im ersten Posting!

    habe hier dann eine funktion die wie folgt aussieht

    int gleicheMengen (Set a, Set b){
    
    }
    

    aber wie kann ich das dann prüfen?

    MFG



  • wie sieht denn dein 'Set' aus?

    typedef struct Set
    {
    ...???
    } Set; ??
    

    😕



  • alles schon ok, habs hinbekommen glaube ich, mit 2 For schleifen und dann geprüft ob

    a[i] != b[i]

    ist und dann return 0 zuück gegeben wenn es ungleich ist...

    am ende der funktion halt nen return 1 wenn sie gleich sind...

    trotzdem danke



  • Wie kann man den wohl abfragen ob ein bestimmtes Bit im Byte 1 ist???
    Die Position an der die 1 stehen muss habe ich errechnet ich verstehe nur nicht wie ich jetzt explizit auf ein Bit zugreifen kann um die abfrage zu Programmieren!

    ???



  • Immer noch mit Bit-Operationen:

    if(byte&(1<<bitnum)!=0) ...
    

    ("1<<bitnum" liefert eine Bitmaske, bei der nur das 'bitnum'ste Bit gesetzt ist, durch die &-Kombination erhältst du genau den Inhalt des entsprechenden Bits in 'byte')


Anmelden zum Antworten