10

试图找到绝对值,我认为有一种简单的方法可以用“〜”或其他东西来反转符号。

4

8 回答 8

22
float newValue = oldValue * -1;

或者

float newValue = -(oldValue); //() aren't needed, I just use them out of habit
于 2010-01-08T05:53:24.383 回答
13

要反转符号,请在其前面加上减号。

于 2010-01-08T05:53:14.960 回答
12

对作品的简单否定-,但大多数答案都忽略了OP试图做绝对值的事实。为此,正确的工具是abs()用于整数和fabs()浮点数。代码将非常清晰,结果将是您所期望的。(编辑:一定要阅读这些工具的文档和错误。正如尼克指出的那样,用负数取反会abs()返回相同的负数。)

于 2010-01-08T06:19:15.457 回答
8

一元否定运算符-(expr)完全符合您的要求。

int x = -7;
int y = 7;
x = -x; // x is now 7
y = -y; // y is now -7

~(expr)另一方面,您提到的按位补码运算符会翻转输入中的所有位。

如果它有帮助,许多绝对值实现在野外忽略的一个问题是,对给定的固定大小的二进制补码整数类型的最负值取反将溢出。

于 2010-01-08T06:01:02.433 回答
4

-x 将为您提供 x 的符号反转值。

于 2010-01-08T05:53:37.740 回答
4

棘手的主题。更改浮点数符号的直接​​方法是翻转变量最高有效位的值。其他答案中列出的符号由编译器决定,这通常很好,但并非总是如此。对于“float x”,答案是:

*(unsigned int*)&x ^= (1<<31)

如果您正在为具有 Cortex A8 处理器(或类似处理器)的 iPhone 编写代码,则在使用内部循环中的浮点数时,您希望避免使用双精度数并避免使用条件语句。所以,你可以这样做:

*(unsigned int*)&x ^= ( (x<0) << 31 );

这将在不使用分支指令的情况下将否定变为肯定。如果这是在一个内部循环中,它将比在 iPhone 上使用另一种方法快 5 到 20 倍。如果它不在内部循环中,那么您可能不会太在意!

于 2010-10-04T21:43:33.353 回答
1

x = 0 - x;

? 还是我错过了重点?

于 2010-01-08T05:53:48.483 回答
-1

这是一个糟糕的解决方案,不确定这里发生了什么。正确答案请参见下面的 abs() 答案。

尽管这是一个老问题,但也许这个答案会对你们中的一些人有所帮助。我想根据另一个结果(假设是布尔值 mustBeNegative)获得一个数字的正值或负值,我这样做的方式是:

int number = 7;
if(mustBeNegative)
{
      number = number * 1;
}
else
{
      number = number * -1;
}

该数字将是基于“mustBeNegative”值的正值或负值。当数字已经是负数时,它将变为正数,反之亦然。

于 2013-10-20T14:51:35.683 回答