位运算比较

作者: IT_Matters | 来源:发表于2016-07-06 12:56 被阅读102次

    对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。
    给定两个整数ab,请返回较大的数。

    测试样例:1,2
    返回:2

    思路

    将整数看成2进制数,逐位进行比较.从第30位开始(因为第31位是符号位),采用与mask按位与的方式提取出每一位上的数字, 如果提取出的数字相等就可以进行比较.与mask按位与结果不是0的那个数字比较大.
    例如整数1和2,看成01和10.分别与mask=10按位与,得到00和10,这说明10比01要大.
    PS:符号位为1说明是负数, 符号位为0是正数.

    代码如下:

      public int getMax(int a, int b) {
           
            int mask=1<<31;  
            //第一位符号位要特殊处理
            if(((a&mask)^(b&mask))==1){
                   if((a&mask)==0)return a;
                   else return b;
            }        
            mask>>>=1;
            while(mask!=0){
               if(((a&mask)^(b&mask))!=0){
                   if((a&mask)==0)return b;
                   else return a;
               }
               else{
                   mask>>=1;
               }            
            }
            return a;  //两数相等
        }
    

    相关文章

      网友评论

        本文标题:位运算比较

        本文链接:https://www.haomeiwen.com/subject/nqskjttx.html