Als Mathematiker möchte ich meine Sichtweise zu diesem interessanten Problem darlegen. Ich glaube, ich habe die effizienteste Lösung.
Wenn ich mich richtig erinnere, negiert man eine vorzeichenbehaftete 32-Bit-Ganzzahl, indem man einfach das erste Bit umdreht. Zum Beispiel, wenn n = 1001 1101 1110 1011 1110 0000 1110 1010, dann -n = 0001 1101 1110 1011 1110 0000 1110 1010.
Wie definiert man also eine Funktion f, die eine 32-Bit-Ganzzahl mit Vorzeichen annimmt und eine andere 32-Bit-Ganzzahl mit Vorzeichen zurückgibt, mit der Eigenschaft, dass die zweimalige Annahme von f dasselbe ist wie das Umdrehen des ersten Bits?
Lassen Sie mich die Frage neu formulieren, ohne arithmetische Konzepte wie ganze Zahlen zu erwähnen.
Wie definiert man eine Funktion f, die eine Folge von Nullen und Einsen der Länge 32 annimmt und eine Folge von Nullen und Einsen der gleichen Länge zurückgibt, mit der Eigenschaft, dass die zweimalige Ausführung von f dasselbe ist wie das Umdrehen des ersten Bits?
Beobachtung: Wenn Sie die obige Frage für den 32-Bit-Fall beantworten können, dann können Sie sie auch für den 64-Bit-Fall, den 100-Bit-Fall, usw. beantworten. Man wendet f einfach auf die ersten 32 Bit an.
Wenn Sie nun die Frage für den 2-Bit-Fall beantworten können, Voila!
Und ja, es stellt sich heraus, dass es ausreicht, die ersten 2 Bits zu ändern.
Hier ist der Pseudocode
1. take n, which is a signed 32-bit integer.
2. swap the first bit and the second bit.
3. flip the first bit.
4. return the result.
Bemerkung: Der Schritt 2 und der Schritt 3 können zusammen als (a,b) --> (-b, a) zusammengefasst werden. Kommt Ihnen das bekannt vor? Das sollte Sie an die 90-Grad-Drehung der Ebene und die Multiplikation mit der Quadratwurzel von -1 erinnern.
Wenn ich nur den Pseudocode ohne das lange Vorspiel präsentieren würde, würde es wie ein Kaninchen aus dem Hut erscheinen, ich wollte erklären, wie ich zu der Lösung gekommen bin.
6 Stimmen
Um welche Stelle ging es bei diesem Vorstellungsgespräch?