Benutzer mit den meisten Antworten
Zahlen in bits zerlegen

Frage
Antworten
-
Hallo B.,kommt etwas darauf, in welcher Form die Bits vorliegen "sollen".Zum Beispiel:
int zahl = 129; string zahlString = Convert.ToString(zahl, 2); MessageBox.Show("binär: " + zahlString.ToString()); //zahlString ändern ... zahl = Convert.ToInt32(zahlString, 2); MessageBox.Show("dezimal: " +zahl.ToString());
ciao Frank- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 10. Mai 2011 09:28
-
Hallo Bensen83,
Probier's mal so (wörtlich umgesetzt):
// 32-bit Zahl int input = 1; // in Bits zerlegen byte[] numberBytes = BitConverter.GetBytes(input); BitArray bitArray = new BitArray(numberBytes); // vertauschen der Bits bitArray.Set(0, false); bitArray.Set(1, true); // wieder zu einer Zahl wandeln bitArray.CopyTo(numberBytes, 0); int result = BitConverter.ToInt32(numberBytes, 0);
Gruß
Marcel- Als Antwort vorgeschlagen Marcel RomaModerator Montag, 2. Mai 2011 19:36
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 10. Mai 2011 09:28
Alle Antworten
-
Hallo B.,kommt etwas darauf, in welcher Form die Bits vorliegen "sollen".Zum Beispiel:
int zahl = 129; string zahlString = Convert.ToString(zahl, 2); MessageBox.Show("binär: " + zahlString.ToString()); //zahlString ändern ... zahl = Convert.ToInt32(zahlString, 2); MessageBox.Show("dezimal: " +zahl.ToString());
ciao Frank- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 10. Mai 2011 09:28
-
Hallo Bensen83,
Probier's mal so (wörtlich umgesetzt):
// 32-bit Zahl int input = 1; // in Bits zerlegen byte[] numberBytes = BitConverter.GetBytes(input); BitArray bitArray = new BitArray(numberBytes); // vertauschen der Bits bitArray.Set(0, false); bitArray.Set(1, true); // wieder zu einer Zahl wandeln bitArray.CopyTo(numberBytes, 0); int result = BitConverter.ToInt32(numberBytes, 0);
Gruß
Marcel- Als Antwort vorgeschlagen Marcel RomaModerator Montag, 2. Mai 2011 19:36
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 10. Mai 2011 09:28
-
Hallo B.,
So ist zum Beispiel folgendes Vorgehen für eine 32Bit-Zahl am performantesten und aus diesem Gesichtspunkt deutlich einer BitArray/BitConverter-Lösung vorzuziehen:BitVector32 bv = new BitVector32(129); bv[31] = false; // Bits ändern MessageBox.Show(bv.Data.ToString()); // 128
und es kann auch mit Sections und Masken sehr einfach und effizient abgefragt und geändert werden.
Siehe auch die Doku dazu:- Die BitVector32-Struktur ist für intern verwendete boolesche Werte und Small Integers effizienter als die BitArray-Klasse. Eine BitArray-Klasse kann bei Bedarf unbegrenzt erweitert werden, benötigt jedoch den für eine Klasseninstanz erforderlichen Mehrbedarf an Speicher und Leistung.
Will man solche Leistungs-Unterschiede einmal messen, so kann man hierzu im .NET Framework die Stopwatch-Klasse benutzen. Macht man das einmal, kann man erkennen, dass das BitArray hier etwa um den Faktor 29 mal langsamer ist, als der BitVector32.
ciao Frank- Bearbeitet Frank Dzaebel Dienstag, 19. April 2011 10:11
-
Hallo Frank,
So ist zum Beispiel folgendes Vorgehen für eine 32Bit-Zahl am performantesten und aus diesem Gesichtspunkt deutlich einer BitArray/BitConverter-Lösung vorzuziehen
Wie willst Du diesen ach so deutlichen Performanzzugewinn bei der Umwandlung einer Zahl denn messen ("wie kann ich denn eine 32 Bit zahl in einzelne bits zerlegen [...]")? - Ich dachte, was bei 0 Millisekunden liegt, kann gar nicht so unperformant sein...
Gruß
Marcel
-
Frank,
Deine nachträglichen Änderungen sind mir durch die Lappen gegangen...
Will man solche Leistungs-Unterschiede einmal messen, so kann man hierzu im .NET Framework die Stopwatch-Klasse benutzen. Macht man das einmal, kann man erkennen, dass das BitArray hier etwa um den Faktor 29 mal langsamer ist, als der BitVector32.
Nein wirklich??? - Dann zeig uns doch mal den Code, der um Faktor 29 schneller ist als der von mir gepostete Code.Marcel