Ό,τι κι αν παριστάνει το 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