Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Ερώτηση Για τον "|" (logical bitwise OR) operator (C#)

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος pontifikas στις 10-12-2006, 11:13. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  03-08-2005, 10:39 3962

    Ερώτηση Για τον "|" (logical bitwise OR) operator (C#)

    Θα ήθελα να ρωτήσω ποιές μπορεί να είναι οι χρήσεις του.
    Η λογική λέει ότι συγκρίνει bit to bit τα δυο μέρη του και δίνει το αποτέλεσμα που προκύπτει από ΟR.

    Χτές είδα αυτό όμως

    public static readonly VertexFormats FVF_Flags = VertexFormats.Position | VertexFormats.Diffuse;

    όπου VertexFormat είναι enumeration type.
    Ποιό θα είναι το αποτέλεσμα αυτής της ανάθεσης Hmm [^o)]



  •  03-08-2005, 11:54 3963 σε απάντηση της 3962

    Απ:Ερώτηση Για τον "|" (logical bitwise OR) operator (C#)

    Ό,τι κι αν παριστάνει το VertexFormats (το οποίο αν δεν κάνω λάθος είναι σε κάποια βιβλιοθήκη Direct3D) δεν παύει να είναι ένα enum. Ένα enum μπορείς να το δεις σαν ένα set από int με ονόματα. Δηλαδή το VertexFormats.Posistion αντιπροσωπεύει ένα int και αντίστοιχα το VertexFormats.Diffuse ένα άλλο int. Άρα το bitwise or κάνει την ίδια δουλειά στα enum με αυτή που κάνει σε δύο απλούς int. Το αποτέλσμα της πράξης είναι και πάλι int.

    Πάρε το εξής παράδειγμα:

    θες να βάλεις μια λίστα από 5 CheckBoxes (CheckedListBox) και θες με μια και μόνο τιμή να καταχωρήσεις το set από τις επιλογές.

    Ας πούμε ότι έχεις την ερώτηση "Ποιές από τις παρακάτω γλώσσες γνωρίζετε;" και τις επιλογές:

    [  ] C#
    [  ] VB.NET
    [  ] Pascal
    [  ] Java
    [  ] 80x86 Assembly

    μπορείς να κάνεις το εξής:

    να φτιάξεις ένα enum

    public enum languages
    {
       
    CS        = 1,
    // 00000001 (binary)
       
    VBNET     = 2, // 00000010
       
    Java      = 4, // 00000100
       
    Pascal    = 8, // 00001000
       
    Assembly  = 16 // 00010000
    }

    Να φτιάξεις το CheckedListBox σου:

    private System.Windows.Forms.CheckedListBox myCheckedListBox;

    Στο οποίο να προσθέσεις τις επιλογές περίπου ως εξής:

    myCheckedListBox.Items.Add(new selection("C#", languages.CS));
    myCheckedListBox.Items.Add(
    new selection("VB.NET", languages.VBNET));
    myCheckedListBox.Items.Add(
    new selection("Java", languages.Java));
    myCheckedListBox.Items.Add(
    new selection("Pascal", languages.Pascal));
    myCheckedListBox.Items.Add(
    new selection("Assembly", languages.Assembly));

    Όπου selection είναι μια κλάση που θα έχεις ορίσει εσύ ως εξής:

    public class selection
    {
       public 
    string name;
       public 
    languages language;

       
    public selection(string name, languages language)
       
    {
          
    this.name = name;
          
    this.language = language;
       
    }

       override public string ToString()
       
    {
          
    return name;
       
    }
    }

    Αφού κάνει τις επιλογές του ο χρήστης μπορείς να τις φυλάξεις σε μια μεταβλητή ως εξής:

    languages selections = 0;
    foreach (selection s in myCheckedListBox.CheckedItems)
    {
       
    selections |= s.language;  // δηλαδή: selections = selections | s.language;
    }

    Αν ο χρήστης έχει επιλέξει π.χ. Java & C# τότε η τιμή της selections θα είναι languages.Java | languages.CS δηλαδή 4 | 1 δηλαδή σε binary 100 | 1 δηλαδή σε binary 101  δηλαδή 5 στο δεκαδικό  σύστημα. Η τιμή 5 (int) μπορεί να γίνει assign σε μεταβλητή enum.

    Τέλος για να δεις αν ο χρήστης ξέρει Pascal μπορείς να κάνεις το εξής:

    bool KnowsPascal = (selections & languages.Pascal) == languages.Pascal;

    Αυτό είναι κλασικό παράδειγμα της χρήσης του bitwise or σε user interfaces.Φαντάσου ότι θες να φυλάξεις τις επιλογές του χρήστη σε μια database και έχεις στην διάθεσή σου μόνο ένα πεδίο τύπου int. Η λύση αυτή είναι κλασική.

    Φυσικά μπορείς να κάνεις πολλά άλλα πράγματα με αυτό όπως να υπολογίσεις subnets π.χ. αν έχεις να κάνεις με δίκτυα, ή να πάρεις δύο raster (δυο δορυφορικές εικόνες π.χ. ή δύο jpeg) και να κάνεις λογικές πρέξεις ανάμεσα στα bit των pixels για να δημιουργήσεις οπτικά εφέ, σύνθετες εικόνες ή να βγάλεις συμπεράσματα για την βλάστηση...

    Ελπίζω να σε βοήθησα...

    rousso


    rousso
  •  03-08-2005, 14:00 3968 σε απάντηση της 3963

    Απ:Ερώτηση Για τον "|" (logical bitwise OR) operator (C#)

    Ευχαριστώ πολυ φίλε rousso. Ωραίο παράδειγμα. Wink [;)] Δεν το ήξερα αυτό.
    Μέχρι τώρα δεν έδινα τιμές στα enums και άφηνα να παίρνουν τον αύξοντα.


  •  07-12-2006, 10:57 21808 σε απάντηση της 3968

    Απ: Απ:Ερώτηση Για τον "|" (logical bitwise OR) operator (C#)

    Ξανανοίγοντας το θέμα θα ήθελα να ρωτήσω το εξής.
    Καλά με τα enumeration types που δηλώνουμε εμείς.Με τα enumerations που είναι δηλωμένα στο VS πώς γίνεται.

    Βασικά θέλω να κάνω το εξής:
    Θέλω από όλα τα Controls της φόρμας, να αφαιρέσω αν υπάρχει το AnchorStyles.Bottom χωρίς να πειράξω όμως τα υπόλοιπα.
    Αν δηλαδή ένα Control έχει AnchroStyles.Top+AnchorStyles.Bottom, να μείνει μόνο το Top.
    Δυστυχώς δεν μπορώ να κατανοήσω πώς λειτουργούν τα enums ώστε να εφαρμόσω τον κατάλληλο τελεστή.
  •  07-12-2006, 11:48 21813 σε απάντηση της 3962

    Απ: Ερώτηση Για τον "|" (logical bitwise OR) operator (C#)

    Δε θα έπρεπε το συγκεκριμένο enum, να "μαρκαριστεί" με το FlagsAttribute?
    Μην αφήνετε τα media να σας "ταΐζουν"!
  •  07-12-2006, 15:33 21834 σε απάντηση της 21808

    Απ: Απ:Ερώτηση Για τον "|" (logical bitwise OR) operator (C#)

     pontifikas wrote:
    Ξανανοίγοντας το θέμα θα ήθελα να ρωτήσω το εξής.
    Καλά με τα enumeration types που δηλώνουμε εμείς.Με τα enumerations που είναι δηλωμένα στο VS πώς γίνεται.

    Βασικά θέλω να κάνω το εξής:
    Θέλω από όλα τα Controls της φόρμας, να αφαιρέσω αν υπάρχει το AnchorStyles.Bottom χωρίς να πειράξω όμως τα υπόλοιπα.
    Αν δηλαδή ένα Control έχει AnchroStyles.Top+AnchorStyles.Bottom, να μείνει μόνο το Top.
    Δυστυχώς δεν μπορώ να κατανοήσω πώς λειτουργούν τα enums ώστε να εφαρμόσω τον κατάλληλο τελεστή.


    Σύντομη απάντηση: θέλεις να κάνεις myControl.Style &= ~AnchorStyles.Bottom.
    Εξήγηση: Έχεις την τιμή Top | Bottom. Έστω ότι Top = 0001 και Bottom = 0010 σε δυαδικό οπότε Top | Bottom = 0011. Θέλεις από το 0011 να μηδενίσεις το προτελευταίο bit. Για να το κάνεις αυτό, πρέπει να κάνεις and (&) με μια μάσκα που έχει μηδέν στην κατάλληλη θέση, δηλαδή την 1101. Αυτή είναι το συμπλήρωμα του 1 για το 0010, δηλαδή το ~0010, δηλαδή ~AnchorStyles.Bottom.
    Νατάσα Μανουσοπούλου
  •  08-12-2006, 08:26 21865 σε απάντηση της 21834

    Απ: Απ:Ερώτηση Για τον "|" (logical bitwise OR) operator (C#)

    Και πώς ξέρω ότι το Top είναι 0001 και όχι 0010 ή 0100?

    Επίσης, αν έχουμε δηλαδή ένα enumertation type με 10 members αυτό θα χρησιμοποιεί 10 bit για αναπαράσταση?

    Τέλος, πρέπει να αρικοποιώ εγώ τα members για να ισχύουν οι πράξεις με bit. Δηλαδή, αν η παραπάνω δήλωση (στο post του russo) ήταν έτσι:

    public enum languages
    {
    CS,
    VBNET,
    Java,
    Pascal,
    Assembly
    }


    θα έκανε διαφορά?

    Ευχαριστώ.
  •  08-12-2006, 11:54 21875 σε απάντηση της 21865

    Απ: Απ:Ερώτηση Για τον "|" (logical bitwise OR) operator (C#)

    Σε ένα enumeration που είναι μαρκαρισμένο σαν [Flags], ξέρεις ότι κάθε τιμή του έχει αναμμένο ένα bit, χωρίς να σε ενδιαφέρει ποιο. Η αναπαράσταση του enumeration εξαρτάται από τον compiler, ο οποίος θα επιλέξει τον κατάλληλο underlying τύπο.

    Πάντως, σε ένα [Flags] enum, πρέπει μόνος σου να ορίσεις τις τιμές των σταθερών. Στο παράδειγμα που δίνεις παραπάνω, οι τιμές που δίνονται αυτόματα θα ήταν οι CS=0. VBNET=1, Java=2, Pascal=3, Assembly=4.

    Ακόμα, έχεις τη δυνατότητα να ορίσεις και μέλη του enumeration που έχουν περισσότερα bits αναμμένα, για να δώσεις όνομα σε συνδυασμό τιμών, π.χ.:

    [Flags]
    enum Languages
    {
        None = 0x0000,
        CS = 0x0001,
        VBNET = 0x0002,
        Java = 0x0004,
        Pascal = 0x0008,
        Assembly = 0x0010,
        BracketLanguages = CS | Java, // 0x0005
        BeginEndLanguages = VBNET | Pascal, // 0x000A
        All = 0xffff
    }



    Νατάσα Μανουσοπούλου
  •  10-12-2006, 11:13 21970 σε απάντηση της 21875

    Απ: Απ:Ερώτηση Για τον "|" (logical bitwise OR) operator (C#)

    Νομίζω ότι κατάλαβα. Θα κάνω μερικές δοκιμές μόνος μου.
    Αν αποδειχτεί ότι δεν κατάλαβα...θα επανέλθω δημήτριοςStick out tongue (αυτό είναι απειλή)
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems