versuche einen absoluten Wert zu finden und ich dachte, es gäbe einen einfachen Weg, um das Zeichen einfach mit '~' oder etwas zu invertieren.
Einfache Negation mit -
funktioniert, aber die meisten Antworten haben die Tatsache ignoriert, dass das OP versucht, absoluten Wert zu erzielen. Das richtige Werkzeug dafür ist abs()
für Ganzzahlen und fabs()
für Floats. Der Code wird kristallklar sein und das Ergebnis wird sein, was Sie erwarten. (Bearbeiten: Lesen Sie die Dokumentation und Fehler für diese Tools. Wie Nick darauf hinweist, gibt die Negierung der negativsten Zahl mit abs()
die gleiche negative Zahl zurück.)
Der unäre Negationsoperator -(expr)
macht genau das, was Sie wollen.
Der bitweise Komplementoperator ~(expr)
, den Sie erwähnen, dreht andererseits alle Bits in der Eingabe.
Falls es hilft, ein Problem, dass viele absolute Wert-Implementierungen in der Wildnis ignorieren, ist, dass das Negieren des negativsten Wertes eines gegebenen Zweierkomplement-Integer-Typs mit fester Größe überläuft.
Schwieriges Thema. Der direkte Weg, das Vorzeichen einer Gleitkommazahl zu ändern, besteht darin, den Wert des höchstwertigen Bits der Variablen umzukehren. Die in den anderen Antworten aufgeführte Notation ist dem Compiler ausgeliefert, was normalerweise gut ist, aber nicht immer. Für "float x" lautet die Antwort:
*(unsigned int*)&x ^= (1<<31)
Wenn Sie für etwas wie das iPhone schreiben, das einen Cortex A8-Prozessor (oder etwas ähnliches) hat, möchten Sie Doppelungen vermeiden und auch Konditionale vermeiden, wenn Sie mit Schwimmern in inneren Schleifen arbeiten. So können Sie das tun:
*(unsigned int*)&x ^= ( (x<0) << 31 );
Mit dieser Option werden Negative ohne Verwendung eines Verzweigungsbefehls in positive Werte umgewandelt. Wenn dies in einer inneren Schleife ist, ist es 5 bis 20 mal schneller als eine andere Methode auf dem iPhone. Wenn es nicht in einer inneren Schleife ist, interessiert Sie wahrscheinlich nicht zu viel!
Das ist eine beschissene Lösung, nicht sicher, was hier passiert ist. Siehe die Antwort unten mit abs () für den richtigen.
Obwohl dies eine alte Frage ist, wird diese Antwort vielleicht einigen von euch helfen. Ich wollte einen positiven oder negativen Wert einer Zahl haben, die auf einem anderen Ergebnis basiert (sagen wir ein boolesches mustBeNegative), wie ich das gemacht habe:
%Vor%Die Zahl ist ihr positiver oder negativer Wert basierend auf dem Wert "mustBeNegative". Wenn die Nummer bereits eine negative Zahl war, wird sie positiv und umgekehrt.
Tags und Links objective-c operators negate absolute-value