Binäre Quersumme

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets.

    Binäre Quersumme

    Hallo,

    Kann mir jemand helfen.
    Ich möchte eine Binäre Quersumme einer Zahl errechnen ohne diese in einen String zu konvertieren.
    Hier mal ein Beispiel zur Verdeutlichung :

    Input : 1337
    Binär : 0000010100111001
    Binäre Quersumme : 6 (Da 6 Einsen vorkommen)

    Der Algorithmus müsste also als Integer Wert 6 zurückgeben wenn der Input 1337 ist.

    Mein Ansatz war folgender:

    C#-Quellcode

    1. static int GetIntBinaryString(int n)
    2. {
    3. int[] b = new int[32];
    4. int sum = 0;
    5. int pos = 31;
    6. int i = 0;
    7. while (i < 32) {
    8. if ((n & (1 << i)) != 0) {
    9. b[pos] = 1;
    10. } else {
    11. b[pos] = 0;
    12. }
    13. pos--;
    14. i++;
    15. }
    16. foreach(int x in b)
    17. {
    18. if(b[x]==1)
    19. sum++;
    20. }
    21. return sum;
    22. }


    Wird aber immer 0 returned...

    EDIT: Habs gelöst bekommen

    C#-Quellcode

    1. static int GetIntBinaryString(int n)
    2. {
    3. int[] b = new int[32];
    4. int sum = 0;
    5. int pos = 31;
    6. int i = 0;
    7. while (i < 32) {
    8. if ((n & (1 << i)) != 0) {
    9. b[pos] = 1;
    10. } else {
    11. b[pos] = 0;
    12. }
    13. pos--;
    14. i++;
    15. }
    16. for (int x = 0; x < b.Length; x++) {
    17. if (b[x] == 1)
    18. sum++;
    19. }
    20. return sum;
    21. }

    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Rikudo“ ()

    Ich finde, da lässt sich eine bessere™ Lösung finden.

    C#-Quellcode

    1. static int Foo(int Value)
    2. {
    3. int Count = 0;
    4. while (Value != 0)
    5. {
    6. if ((Value & 1) == 1) Count++;
    7. Value >>= 1;
    8. }
    9. return Count;
    10. }

    Funktioniert auch mit long als Parameter, wenn man mehr Bits braucht.

    Edit: bin gerade draufgekommen, dass das mit negativen Zahlen nicht wie erwartet funktioniert. Da wird eine arithmetische Verschiebung genommen. Bei der wird das MSB beibehalten und zum nächst niederwertigen Bit kopiert. Dadurch füllen sich die Bits nach und nach mit Einsen und die Schleife wird nie fertig.
    Ich wieß jetzt nicht, wie man C# sagen kann, eine binäre Verschiebung zu verwenden.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    Ich hab mal ne Version für positive und negative Zahlen gemacht:

    C#-Quellcode

    1. public static ulong Foo(long num)
    2. {
    3. ulong count, uNum = unchecked((ulong)num); //Das unchecked ist wichtig, das erlaubt die passende Konvertierung in den ulong
    4. for (count = uNum & 1u; uNum != 0; count += (uNum >>= 1) & 1u) ; //Gleiche Vorgehensweise wie Niko, nur in einer einzigen Zeile
    5. return count;
    6. }

    Das gibt bei positiven und negativen Zahlen die richtige binäre Quersumme zurück :)

    Grüße

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „nafets“ ()