絶対値を見つけようとして、「〜」などで符号を反転する簡単な方法があると思いました。
8 に答える
float newValue = oldValue * -1;
また
float newValue = -(oldValue); //() aren't needed, I just use them out of habit
符号を反転するには、その前にマイナスを付けます。
単項否定演算子-(expr)
は、まさにあなたが望むことをします。
int x = -7;
int y = 7;
x = -x; // x is now 7
y = -y; // y is now -7
~(expr)
一方、あなたが言及したビット単位の補数演算子は、入力のすべてのビットを反転します。
それが役立つ場合、野生の多くの絶対値の実装が無視する1つの問題は、特定の固定サイズの2の補数整数型の最も負の値を否定するとオーバーフローすることです。
-xは、xの符号が反転した値を示します。
トリッキーなテーマ。浮動小数点数の符号を変更する直接的な方法は、変数の最上位ビットの値を反転することです。他の回答にリストされている表記法は、コンパイラーに翻弄されます。これは通常は問題ありませんが、常にそうであるとは限りません。「floatx」の場合、答えは次のとおりです。
*(unsigned int*)&x ^= (1<<31)
Cortex A8プロセッサ(またはそのようなもの)を搭載したiPhoneのようなものを作成する場合は、内部ループでfloatを操作するときに、doubleを回避し、条件文も回避する必要があります。だから、あなたはこれを行うことができます:
*(unsigned int*)&x ^= ( (x<0) << 31 );
これは、分岐命令を使用せずに負から正に変わります。これが内部ループにある場合、iPhoneで別の方法を使用するよりも5〜20倍高速になります。それが内側のループにない場合は、おそらくあまり気にしないでしょう!
x = 0-x;
?または私はポイントを逃しますか?
これはくだらない解決策であり、ここで何が起こったのかわかりません。正しいものについては、abs()を使用して以下の回答を参照してください。
これは古い質問ですが、おそらくこの答えはあなたの何人かを助けるでしょう。別の結果(ブール値のmustBeNegativeとしましょう)に基づいて、数値の正または負の値を取得したかったのですが、これを行った方法は次のとおりです。
int number = 7;
if(mustBeNegative)
{
number = number * 1;
}
else
{
number = number * -1;
}
数値は、「mustBeNegative」値に基づく正または負の値になります。数がすでに負の数であった場合、それは正になり、その逆も同様です。