关于前几天的一个面试题!

bluesky12312388 2010-06-02 04:44:13
前天看到一题目:如下(原文链接不记得了~-~)
有一函数
int SIGN(int x)
{
if( x > 0 ) return 1;
if( 0 == x ) return 0;
if( x < 0 ) return -1;
}
请你改写这个函数,不能有任何比较,控制转移指令(不能有if,switch,goto,?:等等)
想了好久没想出来正确答案,只能做到
int SIGN(int x)
{
return ( x > 0 ) | ( (x & 0x80000000 ) == 0x80000000 );
}
这一步,如果 x为负数的话结果不正确

后来看到正确答案之一
return  (x >> 30) | (((static_cast<UINT64>(~static_cast<UINT32>(x)) + 1) >> 32) ^ 1);

请高手帮忙解释下为什么是这样,或者说是否还有其它答案!

...全文
229 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljh808 2010-06-02
  • 打赏
  • 举报
回复
看看,学学。
selooloo 2010-06-02
  • 打赏
  • 举报
回复
int SIGN(int x)
{
return ((((x>>31)&1)^1)*x||0)-((x>>31)&1);
}
xxxxxxxxx_ 2010-06-02
  • 打赏
  • 举报
回复
return x / (fabs(x) + (x==0));
xueliang10 2010-06-02
  • 打赏
  • 举报
回复
== > <都是比较符号吧
bluesky12312388 2010-06-02
  • 打赏
  • 举报
回复
可以变一下的
return (x + 1) / abs( x + 1 ) ;
bluesky12312388 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nommm 的回复:]

return x/abs(x);
这样行么?
[/Quote]
这个 不行 当x = 0时呢?
bluesky12312388 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 we_sky2008 的回复:]

C/C++ code

int SIGN(int x)
{
return ( x > 0 ) - ( (x & 0x80000000 ) == 0x80000000 );
}


优化下就是:
C/C++ code

int SIGN(int x)
{
return ( x > 0 ) - (x < 0);
}


使用了> < 号,
不知道算是违规没
[/Quote]

呵呵,是我写错了答案是return ( x > 0 ) - ( (x & 0x80000000 ) == 0x80000000 );
你这里 x > 0就相当是使用了比较了! - -
nommm 2010-06-02
  • 打赏
  • 举报
回复
return x/abs(x);
这样行么?
bluesky12312388 2010-06-02
  • 打赏
  • 举报
回复
for(i = 0; i < 31 ; i ++)
{
m = ((a>>i)&1)|m;
}
这里应该是取除符号位外的数,如果不为0那么m = 1
然后 return m - (a >> 31 & 1) - ( a >> 31 & 1)是对符号位的处理,
Walf_ghoul你的方法好啊
Walf_ghoul 2010-06-02
  • 打赏
  • 举报
回复
答案看起来挺简单啊,不过没看懂:

#include <stdio.h>

int compare(int a);

int main()
{
int a;
while(scanf("%d",&a) == 1)
{
printf("%d\n",compare(a));
}
}

int compare(int a)
{
// 正数:1-0;0:0-0;负数:0-1
int i = 0;
int m = 0;
for(i = 0; i < 31 ; i ++)
{
m = ((a>>i)&1)|m;
}
return m-(a>>31&1)-(a>>31&1);
}

we_sky2008 2010-06-02
  • 打赏
  • 举报
回复

int SIGN(int x)
{
return ( x > 0 ) - ( (x & 0x80000000 ) == 0x80000000 );
}

优化下就是:

int SIGN(int x)
{
return ( x > 0 ) - (x < 0);
}

使用了> < 号,
不知道算是违规没
bluesky12312388 2010-06-02
  • 打赏
  • 举报
回复
这个是考试题,很有中国特色啊~~
  • 打赏
  • 举报
回复
很想知道他们公司写的代码都是这么 烂的么

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧