【发布时间】:2014-07-20 23:22:09
【问题描述】:
我正在尝试仅使用按位运算符来实现符号函数。我知道如果我只想提取有符号整数的符号位,我可以这样做:(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;
}
我想我拥有所有的部分,但不太确定如何将它们组合在一起。任何帮助表示赞赏。
谢谢。
【问题讨论】:
-
使用编译器得到作业问题的答案不一定是错误的。 :)
-
这是一个相当愚蠢的尝试。 (x > 0 ? 1 : x
-
程序员遵循问题约束。
-
你知道小玩意儿吗? graphics.stanford.edu/~seander/bithacks.html。我的评论只是一个贡献,而不是一个答案。
-
OP:使用 (x >> 31) & 1 来提取符号位是,取决于 C 实现和 int 中值位的数量,实现定义或未定义行为,或错了。
标签: c bit-manipulation