我正在尝试使用位运算符来实现符号函数。我知道如果只想提取有符号整数的符号位,可以这样做:(x >> 31) & 1
。
此外,我了解到条件语句可以写成布尔表达式:
if(x) a=y else a=z
,等价于 a = x ? y:z
,可以重写为:
a=( (x<<31) << 31 ) & y + ( !x << 31) >> 31) & z
,假设 x=1 或 0。
然而,这个问题变得有点棘手,因为我有三种条件场景:
如果是正数则返回1,如果是零则返回0,如果是负数则返回-1。
我认为为了做到这一点,我需要使用!
运算符和!0x<非零数>=0
、!0x0=1
、!0x1=0
这一事实。
所以我想出了下面这段代码,但是它是错误的:
/*
* sign - return 1 if positive, 0 if zero, and -1 if negative
* Examples: sign(130) = 1
* sign(-23) = -1
* Legal ops: ! ~ & ^ | + << >>
*/
int sign(int x) {
return (x>>31) & -1 ) + ( !( !x >> 31 ) & 1;
}
我觉得我已经掌握了所有的要点,但不太确定如何将它们组合在一起。非常感谢您的帮助。
谢谢。