Negative Or Set?

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Negative Or Set?

    Moinsen,

    Gegeben ist ein Integer a der zwischen In32.MinValue und Int32.MaxValue liegen kann.
    Es sollen nun zwei Zahlen a und b gefunden werden, sodass a | b == Inputzahl.
    Ich habe hierzu bereits etwas auf die Beine gestellt, allerdings werden negative Werte nicht unterstützt bzw negative Werte funktionieren nicht.

    C#-Quellcode

    1. /// <summary>
    2. /// Generate a two factos which equal the value-parameter when Or'ed.
    3. /// </summary>
    4. /// <param name="value">Value to which should get splitted into factors for Or-operation.</param>
    5. /// <returns>Factors when Or'ed together equal the value-parameter.</returns>
    6. private static int[] DetermineOr(int value)
    7. {
    8. if (value < 0)
    9. throw new DivideByZeroException("Value can't be less then zero.");
    10. int[] a = new int[2];
    11. int b = value;
    12. int c = rnd.Next(0, value);
    13. int d = b & c;
    14. int e = b & ~c;
    15. a[0] = d;
    16. a[1] = e;
    17. return a;
    18. }


    Wie kann ich diesen Algorithmus erweitern das auch negative Werte unterstützt werden?

    Mfg
    Rikudo
    C# Developer
    Learning C++
    @Rikudo konvertiere die nach uint und feddich.
    Da es keine Überläufe gibt, geht das völlig problemlos. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    gibts da eine Exception?
    Jou.

    C#-Quellcode

    1. int c = rnd.Next(0, value);
    löst eine aus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hmm, das scheint zu funktionieren :

    C#-Quellcode

    1. private static int[] DetermineOr(int value)
    2. {
    3. int[] a = new int[2];
    4. int b = value;
    5. int c = 0;
    6. if (value < 0)
    7. c = rnd.Next(Int32.MinValue, 0);
    8. else
    9. c = rnd.Next(0, value);
    10. int d = b & c;
    11. int e = b & ~c;
    12. a[0] = d;
    13. a[1] = e;
    14. return a;
    15. }



    At least my test for values between Int32.MinValue and Int32.MaxValue didn't throw any errors:

    C#-Quellcode

    1. ​static unsafe void Main(string[] args)
    2. {
    3. for (int i = Int32.MinValue; i < Int32.MaxValue; i++)
    4. {
    5. if(i==0)
    6. Console.WriteLine("Halfway!");
    7. int[] a = DetermineOr(i);
    8. if (i != (a[0] | a[1]))
    9. Console.WriteLine("Bad");
    10. }
    11. Console.WriteLine("Done");
    12. Console.ReadKey();
    13. }
    14. private static Random rnd = new Random();
    15. /// <summary>
    16. /// Generate a two factos which equal the value-parameter when Or'ed.
    17. /// </summary>
    18. /// <param name="value">Value to which should get splitted into factors for Or-operation.</param>
    19. /// <returns>Factors when Or'ed together equal the value-parameter.</returns>
    20. private static int[] DetermineOr(int value)
    21. {
    22. int[] a = new int[2];
    23. int b = value;
    24. int c = 0;
    25. if (value < 0)
    26. c = rnd.Next(Int32.MinValue, 0);
    27. else
    28. c = rnd.Next(0, value);
    29. int d = b & c;
    30. int e = b & ~c;
    31. a[0] = d;
    32. a[1] = e;
    33. return a;
    34. }


    However its pretty slow, maybe someone has some ideas for performance improvements?

    C# Developer
    Learning C++

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

    C#-Quellcode

    1. private static Tuple<int, int> DetermineOr(int value)
    2. {
    3. return Tuple.Create(value, 0); // 0 | value = value :P
    4. }

    Die Funktion erfüllt zwar Deine Anforderungen, aber das ist wahrscheinlich nicht das, was Du suchst. Könntest Du genauer spezifizieren, welche Eigenschaften die Funktion haben soll? Sollen beide Zahlen normalverteilt sein? Sollen beide Zahlen zumindest != 0 sein? Sollen auch Bits vorhanden sein, die in beiden Zahlen 1 sind?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hi
    was möchtest du jetzt? Alle Kombinationen oder nur eine zufällige?
    Alle Kombinationen ergeben sich aus einer 1 in einer Zahl: Es gibt pro gesetztem Bit drei Möglichkeiten für (links, rechts): (0, 1), (1, 0) , (1, 1), die musst du halt für alle Stellen durchgehen (quasi nur alle Einsen hochzählen und Nullen auslassen).
    Für beliebige Zahlen könnte man einfach eine weitere Zufallszahl hinzufügen:

    C#-Quellcode

    1. (random.Next(0, 256) << 24) ^ random.Next(0, 1 << 24)


    Viele Grüße
    ~blaze~