共有回帖数 0 个
- 关于“复旦变态题:仅用位运算判断两个不同数的大小”的一种解法
-
只看楼主
收藏
回复
-
首先声明,我不是c语言高手,但本人在此题总共花了近5个小时时间,所以请尊重我的劳动成果,不喜勿喷,谢谢。
核心代码11步,其他代码用于测试。
此题能够完成,关键是负数在计算机中的补码表示,否则涉及正负数比较或者两个负数比较很难完成。
我想尝试完成此题的各位高手都知道关键是找到x,y两数的二进制表示中从左数的第一个不同位。关于这个我有两种思路,但是第一种思路(昨天晚上想的)错了,但是作为注释放在代码中了,送给想看的人。
第二种思路(待比较的数为x和y):
1. x和y异或,找出所有x和y不同的位,即x^y;
2. 分别找到x和y在其不同位中的具体值,即:
a=x&(x^y);
b=y&(x^y);
3. 从第一个不同的位后的首个‘1’开始,将右边的位全置1,做法如下:
a |= a 1; a |= a 2; a |= a 4; a |= a 8; a |= a 16;
b |= b 1; b |= b 2; b |= b 4; b |= b 8; b |= b 16;
其目的是在下一步中唯一确定x和y中的首个不同的位,但表现在a和b中。
4. 确定x和y中的首个不同的位,用异或,找出能反映两数大小的信息:
a=a&(a^b);
//a大返回正值,a小返回负值,相等为0


楼主 2015-11-05 13:56 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知