none
Zahlen in bits zerlegen RRS feed

  • Frage

  • Hallo, wie kann ich denn eine 32 Bit zahl in einzelne bits zerlegen und später nach vertauschen der bits die einzelnen bits wieder zu einer zahl wandeln?
    Montag, 18. April 2011 20:48

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());
    
    
    Andere Möglichkeiten gehen über die BitArray-KlasseBitConverter oder BitVektor32.

    ciao Frank
    Montag, 18. April 2011 21: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

    Dienstag, 19. April 2011 05:51
    Moderator

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());
    
    
    Andere Möglichkeiten gehen über die BitArray-KlasseBitConverter oder BitVektor32.

    ciao Frank
    Montag, 18. April 2011 21: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

    Dienstag, 19. April 2011 05:51
    Moderator
  • Hallo B.,
    Frank schrieb: Andere Möglichkeiten gehen über die BitArray-Klasse, BitConverter oder BitVektor32.

    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
    Dienstag, 19. April 2011 07:56
  • 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


    Dienstag, 19. April 2011 09:31
    Moderator
  • 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

    Montag, 2. Mai 2011 19:36
    Moderator