C中的符号函数仅使用位运算符

use*_*227 3 c bit-manipulation

我正在尝试仅使用按位运算符来实现符号函数.我知道如果我只想提取有符号整数的符号位,我可以这样做:(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.

这个问题有点棘手,因为我有3个条件场景:
如果为正则返回1,如果为零则返回0,如果为负则返回-1.

我在想,为了正确地做到这一点,我需要使用!运营商和事实!0x<nonzero #>=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;
}
Run Code Online (Sandbox Code Playgroud)

我想我已经完成了所有的工作但不太确定如何把它们放在一起.任何帮助表示赞赏.

谢谢.

das*_*ght 9

位黑客页面显示该表达式:

sign = (v != 0) | (v >> 31);
Run Code Online (Sandbox Code Playgroud)

它可以在没有!=这样的情况下重写:

sign = (!!v) | (v >> 31);
Run Code Online (Sandbox Code Playgroud)

(关于ideone的演示).

我更喜欢这个不使用位操作的表达式(来自同一页面).

sign = (v > 0) - (v < 0);
Run Code Online (Sandbox Code Playgroud)

  • 前两个非常不便携,最后一个非常精细和正确.它具有额外的好处,适用于所有实际类型,包括有符号,无符号,所有大小和浮点. (3认同)