共有回帖数  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号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知