2010-11-24 12 views
1

Okay, habe eine Frage. Ich habe eine Bitmaske für Optionen zusammengestellt. Grundsätzlich hat meine Seite ein Listenfeld, das mehrere Auswahlen erlaubt, die sie in einer Liste von Ganzzahlen (ihren ID-Wert) speichert. Es gibt insgesamt 14 Auswahlmöglichkeiten (also ID-Wert 1-15). Der Grund, warum ich dies zu einer Bitmaske zusammenfasse, liegt darin, dass ich eine Zahl nicht fest codieren möchte, wenn ich der Datenbanktabelle Optionen hinzufügen möchte (von denen das Listenfeld auffüllt). Außerdem möchte ich nicht 14 Parameter an meine gespeicherte SQL-Prozedur senden (also in der Nummer 14 fest codieren). Ich kann diese Ganzzahl einsenden und sie dekonstruieren (späterer Schritt).Gefundene Bits einer ganzen Zahl finden

Allerdings muss ich jetzt aus einem anderen Grund herausfinden, welche Bits in meiner Ganzzahl gesetzt sind. Grundsätzlich habe ich eine Eigenschaft. Der get assembliert die Bitmaske aus einer Liste von Ganzzahlen (die von der Benutzerauswahl erhalten wurden) und gibt eine Ganzzahl dieses binären Dezimalwerts zurück. Hier ist mein Code zum Aufbau der Bitmaske.

//optsNum is my integer list. This is the list containing the ID nums of the selections. 
//so if the user selects the first, second, and fourth option, the list contains 1,2,4 (count 3) 
//typeCount is an integer of the amount of options in the list box 
int total = 0; 
for (int c = 0; c < optsNum.Count(); ++c) 
{ 
    for (int i = 0; i <= typeCount; i++) 
    { 
     if ((i + 1) == optsNum[c}) 
      total += (1 << i); 
    } 
} 
return total; 

Wenn also die erste, zweite und vierte gesetzt, meine ganze Zahl ist 11. Dies funktioniert, ich für alle Auswahlen getestet und es wird die richtige integer/Dezimalwert zurück.

Im Moment brauche ich Hilfe bei der Erstellung meiner Set-Methode. Dies muss den Dezimal/Ganzzahl, die ich habe, nehmen, herauszufinden, welche Bits gesetzt sind und diese zurück in die Liste setzen. Also, wenn ich 11 als meinen Wert habe, muss ich in eine Liste von ganzen Zahlen 1,2,4 einfügen. Kann mir jemand helfen?

Antwort

4

Sie sollten stattdessen die BitArray class verwenden; es macht die bitweisen Operationen für Sie und hat eine einfache Schnittstelle.
Wenn Sie nie mehr als 32 booleans benötigen, können Sie auch die BitVector32 class verwenden, die kleiner ist.


Um Ihre Frage zu beantworten, müssen Sie über jedes Bit in einer Schleife (eine einfache eine for-Schleife) und prüfen value & (1 << i) zu sehen, ob die i te Bit gesetzt ist.

+0

Gibt es trotzdem eine Rückgabe der Position und nicht des Bitwerts? Zum Beispiel tue ich was du gesagt hast. Position 1,2,4 ist eingestellt (Wert 1,2,8). Ich brauche sie jedoch, um die Positionen zurückzugeben .... nicht den Wert dieser Position. Also brauche ich mein neues Array, um 1 2 4 nicht 1 2 8 aufzulisten. – Tom

+0

Egal, ich bin ein Idiot. Ich kann einfach die Position, die ich in der Schleife bin, zu meiner Liste hinzufügen. BEEINDRUCKEND! schreckliche Kopfschmerzen und meine Meinung will nicht nur den Tag vor der Erntedankfestferien funktionieren. – Tom

Verwandte Themen