2. Compute the sign of an integer

计算整数的符号

int v;      // 我们想要找到v的符号
int sign;   // 结果保存在这里

// CHAR_BIT是每个字节的位数(通常为8位)。
sign = -(v < 0);  // 如果v < 0,则为-1,否则为0。
// 或者,为了避免在带有标志寄存器的CPU(如IA32)上分支:
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
// 或者,为了减少一条指令(但不具有可移植性):
sign = v >> (sizeof(int) * CHAR_BIT - 1);

上面的最后一个表达式等同于对于32位整数,sign = v >> 31。这比明显的方法sign = -(v < 0) 快一次操作。这个技巧的原因是,当有符号整数向右移位时,最左边的位的值被复制到其他位上。最左边的位在值为负时为1,否则为0;所有的1位得到-1。不幸的是,这种行为是与体系结构相关的。

或者,如果你希望结果要么是-1,要么是+1,那么可以使用:

sign = +1 | (v >> (sizeof(int) * CHAR_BIT - 1));  // 如果v < 0,则为-1,否则为+1

另一方面,如果你希望结果要么是-1,要么是0,要么是+1,那么可以使用:

sign = (v != 0) | -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
// 或者,为了更快但不够可移植:
sign = (v != 0) | (v >> (sizeof(int) * CHAR_BIT - 1));  // -1, 0, 或 +1
// 或者,为了可移植性、简洁和(也许)速度:
sign = (v > 0) - (v < 0); // -1, 0, 或 +1

如果你希望知道某物是否为非负数,结果为+1,否则为0,可以使用:

sign = 1 ^ ((unsigned int)v >> (sizeof(int) * CHAR_BIT - 1)); // 如果v < 0,则为0,否则为1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值