试图找到绝对值,我认为有一种简单的方法可以用“〜”或其他东西来反转符号。
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)
另一方面,您提到的按位补码运算符会翻转输入中的所有位。
如果它有帮助,许多绝对值实现在野外忽略的一个问题是,对给定的固定大小的二进制补码整数类型的最负值取反将溢出。
-x 将为您提供 x 的符号反转值。
棘手的主题。更改浮点数符号的直接方法是翻转变量最高有效位的值。其他答案中列出的符号由编译器决定,这通常很好,但并非总是如此。对于“float x”,答案是:
*(unsigned int*)&x ^= (1<<31)
如果您正在为具有 Cortex A8 处理器(或类似处理器)的 iPhone 编写代码,则在使用内部循环中的浮点数时,您希望避免使用双精度数并避免使用条件语句。所以,你可以这样做:
*(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”值的正值或负值。当数字已经是负数时,它将变为正数,反之亦然。