Seite 2 von 2 ErsteErste 12
Ergebnis 21 bis 27 von 27

Thema: Bitweise XOR Operation?

  1. #21
    du weißt scheinbar nicht, worauf ich hinaus wollte?

    du brauchst, um den Zustand von 14 Schaltern zu speichern, nur eine Variable, eben wenn du es Dezimal speicherst, da 14 Binäre HI's den maximalen Wert von 16384 annehmen, und das kann man imo in eine 2k sowie 2k3 Variable speichern. Wenn du nun den Schalter umlegst, einfach diesen Wert umrechnen und gut ist.

    die Negation deines Lösungsweges sollte imo kein Prob mittels eines Cycels sein.

    So, zu deinem Rückwärts entziffern frag ich mich wo dein Prob ist, Modul und Division sollten dir bekannt sein, und damit ist es in meinem Augen kein Problem, eine Variable vorwärts sowie Rückwärts in ihre Einzellstellen zu zerlegen. Wozu du nun Pointer mit ins Spiel bringst, ist mir nun ein Rätsel.

  2. #22
    Zitat Zitat von DR_Zeph
    du weißt scheinbar nicht, worauf ich hinaus wollte?

    du brauchst, um den Zustand von 14 Schaltern zu speichern, nur eine Variable, eben wenn du es Dezimal speicherst, da 14 Binäre HI's den maximalen Wert von 16384 annehmen, und das kann man imo in eine 2k sowie 2k3 Variable speichern. Wenn du nun den Schalter umlegst, einfach diesen Wert umrechnen und gut ist.
    Naja, die Lösung selbst habe ich schon lange fertig. Allerdings habe ich für den Zustand der Schalter keine Variable, sondern 14 einzelne Switches verwendet, weil diese einfacher abzufragen sind, um die Grafiken für die Schalter bewegen zu lassen. Der Zustand des Rätsels ist aber das einzige, was ich mit Switches speichere. Für den Zustand brauche ich überhaupt keine Variable, aber ich brauche 14 Variablen, um zu bestimmen, welche Switches welcher der 14 Schalter switcht..

    Zitat Zitat
    die Negation deines Lösungsweges sollte imo kein Prob mittels eines Cycels sein.
    Tja, der Lösungsweg ist nunmal zufällig. Aber ich erkläre jetzt mal konkret, was ich codetechnisch gemacht habe, um die Variablen zu erzeugen: Ich habe zunächst eine zufällige Variable zwischen 0 und 16383 erstellt, die bitweise definiert, welche Schalter für die Lösung relevant sind, also gedrückt werden müssen, und welche nicht. Diese nenne ich die Relevanzvariable. Mit Hilfe dieser Variable habe ich dann die Nummern der letzten beiden relevanten Schalter ausfindig gemacht (hier ist das Problem mit dem Rückwärtsentziffern). Anschliessend habe ich für jede Variable eine Zahl aus zufälligen Bits zusammengesetzt und zwar mit Hilfe von mehreren Loops und Pointern. In dieser Routine musste ich auch einbauen, dass das Bit, welches den Schalter der entsprechenden Variablen selbst darstellt, auf jeden Fall 1 sein muss, damit der bezogene Schalter auf jeden Fall umgeschaltet wird. Bei der Variable des vorletzten relevanten Schalters habe ich zunächst den Lösungsweg bis dahin berechnet. Konkret habe ich die Variablen aller relevanten Schalter mit der XOR-Operation berechnet und in die Lösungsvariable gespeichert. Diese wird dann wieder aufgesplittet, um das Bit des letzten relevanten Schalters in der Variable des vorletzten relevanten Schalters gleich zu setzen wie das Bit der bisherigen Lösungsvariable (dies ist notwendig, damit der letzte Schalter zu diesem Zeitpunkt der Lösung auf jeden Fall nicht umgelegt ist). Anschliessend habe ich beim letzten relevanten Schalter zunächst nochmals eine XOR-Operation durchgeführt und zwar mit der Lösungsvariable und der Variable des vorletzten Schalters. Die Negation der Lösungsvariable bis dahin muss dann dem Bitmuster des letzten relevanten Schalters entsprechen, damit dieser alle zu diesem Zeitpunkt nicht umgelegten Schalter umlegt. Negiert wird ganz einfach, indem die Differenz der Zahl und 16383 berechnet wird.

    Zitat Zitat
    So, zu deinem Rückwärts entziffern frag ich mich wo dein Prob ist, Modul und Division sollten dir bekannt sein, und damit ist es in meinem Augen kein Problem, eine Variable vorwärts sowie Rückwärts in ihre Einzellstellen zu zerlegen. Wozu du nun Pointer mit ins Spiel bringst, ist mir nun ein Rätsel.
    Du hast mich nicht verstanden. Die Pointer brauche ich, um zu speichern, welche der 14 Schalter die letzten beiden relevanten Schalter sind und diese brauche ich wie oben beschrieben für die Berechnung ihrer eigenen Variablen, damit diese zusammen mit den anderen relevanten Schaltern den Lösungsweg ergeben können.

    Und meine Frage ist unbeantwortet. Vorwärts aufsplitten ist kein Problem, da nehme ich einfach direkt /2 und mod2. Ich will aber rückwärts aufsplitten können.

    EDIT:
    Ich sehe beim nochmals durchlesen gerade, dass ich mich falsch ausgedrückt habe: Das Problem ist die Berechnung für das Rückwärts-entziffern (also vom hohen zum tiefen Bit).

    Geändert von TheBiber (12.08.2005 um 16:11 Uhr)

  3. #23
    Simpel ausgedrückt, du brauchst eine Routine die dafür sorgt, dass das Rätsel überhaupt lösbar ist, d.h. sich durch den Zufall nichts bildet, was niemals zum Ziel führen kann.
    DAS is mal ne Aufgabe ^^
    Knifflig uhm... öhm du könntest erstmal nur 13 Schalter definieren und dann eine Matrix durchrechnen lassen, obs eine Lösung gibt (0/1-Matrizen dürften net soo schwer sein, ich nehm mal an, damit hast du kein Problem so wie du geskillt bist) und wenn nicht eine Lösung festlegen lassen.
    Soll ich mir den Kopf drüber zerbrechen oder kommst du alleine auf den Code der Matrix? (ich würd dir jetzt einen Code schreiben weil ich gerne komplexes Zeuch mache aber der viele Sekt hat da irgendwie was dagegen und meint ich soll pennen)

    edit: Uh mir is noch was eingefallen, müssten die 14 Switchvariablen nicht einfach in der Matrix mit einem Faktor von 1 oder 0 (Lösungswegabhängig was 1 und was 0) einfach 16384 (11111111111111b) ergeben? kA obs richtig is, zu kirre im Kopp um klar Mathematik zu machen

    Geändert von Dhan (12.08.2005 um 23:46 Uhr)

  4. #24
    Zitat Zitat
    Und meine Frage ist unbeantwortet. Vorwärts aufsplitten ist kein Problem, da nehme ich einfach direkt /2 und mod2. Ich will aber rückwärts aufsplitten können.
    Rückwärts aufsplitten stellt imo auch kein Prob dar, da es das selbe Prinzip ist, wie das Vorwärts aufsplitten.

    Dafür fallen mir direkt zwei Methoden ein, wie das ganze imo kein Prob sein sollte, wovon ich einfach eine mal Code,



    Variable Dekade muss dabei auf die Stelle gesetzt werden, die herausgefiltert werden soll. Die Variable Hilfsvariable wird nacher auf den Wert gesetzt, den die Stelle hat.

  5. #25
    Zitat Zitat von DR_Zeph
    Rückwärts aufsplitten stellt imo auch kein Prob dar, da es das selbe Prinzip ist, wie das Vorwärts aufsplitten.
    Na, dann erklär mir doch bitte das Prinzip. Wenn ich eine Zahl habe, z.B. 11010 = 26, und ich diese nach und nach mit /2 und Mod2 aufsplitte, kommen nach und nach die Werte 0, 1, 0, 1, 1, in dieser Reihenfolge. Meine Frage ist, wie funktioniert das Verfahren, wenn ich die Werte in der umgekehrten Reihenfolge haben will, also 1, 1, 0, 1, 0?

    Zitat Zitat
    Dafür fallen mir direkt zwei Methoden ein, wie das ganze imo kein Prob sein sollte, wovon ich einfach eine mal Code,

    Variable Dekade muss dabei auf die Stelle gesetzt werden, die herausgefiltert werden soll. Die Variable Hilfsvariable wird nacher auf den Wert gesetzt, den die Stelle hat.
    Mit dem Code kann ich leider nicht viel Anfangen, da du meine Idee falsch aufgefasst hat. Ich brauche nicht den Wert einer bestimmten Stelle bei bekannter Stellennummer, sondern ich brauche die Nummer einer im voraus unbekannten Stelle, die erstmals bzw. zweitmals den Wert 1 hat. Zudem habe ich doch gesagt, dass ich binär und nicht dezimal arbeite. Ausserdem habe ich den Code schon längst geschrieben und dann auch noch effizienter, da ich ein Loop verwendet habe und nicht einfach hintereinander kopierte Befehle mit sich stetig ändernden Werten. Darf ich fragen, wie es mit deiner Programmiererfahrung steht?

    Mein einziges Problem ist, wie man die Zahl berechnen soll, damit die einzelnen Stellen in der umgekehrten Reihenfolge ausgelesen werden, wie oben beschrieben. Und dazu brauche ich keinen Code, sondern lediglich einfache mathematische Anweisungen, auf die ich momentan nicht selbst komme bzw. die ich auch im Netz nicht so finde.


    EDIT: @Dhan:
    Erstmal wieder nüchtern werden.
    Danach würde ich empfehlen, meine Posts nochmals durchzulesen, ich habe die Lösung schon lange programmiert, ich habe lediglich noch dieses eine Problem (und evtl. noch Fehler, aber das konnte ich ja noch nicht austesten), Deine Idee wäre natürlich auch ein guter Ansatz und ja, am Ende muss die Lösung den Wert 16383 annehmen (nicht 16384, weil die 0 auch inbegriffen ist). Der einzige Nachteil deiner Idee ist die relativ lange Rechenzeit und dass, falls es keine Lösung gibt, automatisch wieder meine Methode angewendet werden müsste, also lass ich es mit dem Überprüfen, das Rätsel ist auch so schwierig genug und falls es zufälligerweise einmal zwei Lösungen geben sollte, ist mir das auch recht.

    Geändert von TheBiber (13.08.2005 um 15:51 Uhr)

  6. #26
    Nya, scheinbar bist du außerhalb des Rings net unterwegs, weil du mich dann vll kennen würdest und sich die Frage nach meiner Programmiererfahrung erübrigen würde.

    In Beispielen arbeite ich meist ungern mit Cycklen und Pointern, da sie den Code imo unübersichtlich machen und somit das Verständnis erschweren würden, zudem schau ich bei meinen Code's ob es sich lohnen würde, einen Cyckel zu benutzen, oder ich die Sache 2 mal kopier und 2 Werte veränder.


    Dann frag ich mich jez, wo dein Prob liegt, mit meinem Code kann man vor sowie Rückwärts die Stellen auslesen. Dazu einfach einmal Variable Dekade auf 14 setzen, und dann nach jedem durchlauf -1 auf die Variable Dekade anwenden. Schon fängt der Maker an, und liest von Links nach Rechts die Variable in ihre einzellnen Stellen aus.

    Durch erweiterung einer Variable kannst du zudem erechnen wieviele Werte 1 sind, durch erweiterung noch einer Variable kannst du bestimmen, welche Stelle die zweite, dritte, oder vierte 1 besitzt.

    Somit seh ich eigentlich keinen Fehler in meinem Code, aber ich lass mich gerne belehren.

  7. #27
    Zitat Zitat von DR_Zeph
    Nya, scheinbar bist du außerhalb des Rings net unterwegs, weil du mich dann vll kennen würdest und sich die Frage nach meiner Programmiererfahrung erübrigen würde.
    Und wieso sollte ich dich dann kennen? Und meine Frage bleibt damit unbeantwortet.

    Zitat Zitat
    In Beispielen arbeite ich meist ungern mit Cycklen und Pointern, da sie den Code imo unübersichtlich machen und somit das Verständnis erschweren würden, zudem schau ich bei meinen Code's ob es sich lohnen würde, einen Cyckel zu benutzen, oder ich die Sache 2 mal kopier und 2 Werte veränder.
    Loops lohnen sich generell immer, da der Code allgemeiner ist und auch auf andere Probleme übertragen werden kann. Ausserdem bin ich es gewohnt, auf diese Art zu denken, das andere verwirrt mich eher und gibt nicht gerade das Bild eines guten Programmierstils ab, weshalb ich auch obige Frage gestellt habe.

    Zitat Zitat
    Dann frag ich mich jez, wo dein Prob liegt, mit meinem Code kann man vor sowie Rückwärts die Stellen auslesen. Dazu einfach einmal Variable Dekade auf 14 setzen, und dann nach jedem durchlauf -1 auf die Variable Dekade anwenden. Schon fängt der Maker an, und liest von Links nach Rechts die Variable in ihre einzellnen Stellen aus.

    Durch erweiterung einer Variable kannst du zudem erechnen wieviele Werte 1 sind, durch erweiterung noch einer Variable kannst du bestimmen, welche Stelle die zweite, dritte, oder vierte 1 besitzt.

    Somit seh ich eigentlich keinen Fehler in meinem Code, aber ich lass mich gerne belehren.
    Von Fehlern war nie die Rede.

    Aber jetzt sehe ich, nach welchem Prinzip der Code funktioniert: Eine Zählvariable wird hochmultipliziert bzw. heruntergeteilt und dann schrittweise als Divisor verwendet, um aus der Variablen die einzelnen Stellen herauszulesen.
    Ist aber noch mühsam, dieses Prinzip aus dem RM-Code herauszulesen. In Worte gefasst hätte ich es eher verstanden, vor allem, weil der Code meiner Meinung nach auch unzureichend kommentiert war und überhaupt, weil da jegliche Erklärung fehlte.

    Aber ich bedanke mich mal für die Lösung, werde sie alsbald mal einbauen und hoffe, dass das Rätsel endlich einwandfrei funktioniert.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •