一道面试题,比较基础~~~~

nothing11229 2008-04-16 07:32:27
题目就是,不用if,?,switch等判断关键字,如何判断a,b中较大的一个值
我看标准答案是这样子的:
void fn2(int a , int b)
{
int c = a - b;
int re[2];
re[0] = a;
re[1] = b;
c = unsigned(c) >> (sizeof(int) * 8 - 1);
cout<<re[c]<<" is bigger!!!"<<"\n";
}
请问大家怎么解释啊,为什么要转换成无符号的整形后,又左移31位啊???
...全文
112 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
薛定谔之死猫 2008-04-16
  • 打赏
  • 举报
回复
void fn2(int a , int b)
{
int c = a - b;
int re[2];
re[0] = a;
re[1] = b;
c = unsigned(c) >> (sizeof(int) * 8 - 1); //相当于判断差的符号位,1说明为负,那么b>a,刚好re[1]等于b,反之亦然,比较取巧,re[c]要么是re[0],要么re[1],分析一下就知道了
cout < <re[c] < <" is bigger!!!" < <"\n";
}
hityct1 2008-04-16
  • 打赏
  • 举报
回复
是右移31位吧?c就是符号位的值了,0表示正号,re[c]就是re[0],表示a大。同理,1表示负号,表示b大。
nothing11229 2008-04-16
  • 打赏
  • 举报
回复
OK
wuyu637 2008-04-16
  • 打赏
  • 举报
回复
因为c的符号位存储的就是a和b的大小的结果。。
如果 a大,c就是正号,如果a小,c就是负数,


而一个int在计算机里是用4byte来表示的,就是32位。

其中第一位是用来表示正负的,所以转成无符号数后,左31就是这个符号位。。。


64,849

社区成员

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

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