暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据结构和算法【60】不做比较,判断数字大小

皮皮克克 2023-10-06
0

点击关注公众号,干货第一时间送达


昨天的文章:

数据结构和算法【59】交换数字

不知道各位掌握了没,

那是一道位运算的题目,利用的就是异或运算 '^'

属于位运算题目中,

非常非常常用的一种技巧。

今天再看一道位运算的题目,

有点类似。


一、屏幕前的吴彦祖和刘亦菲们,请听题


这道题,

不能使用比较运算及比较函数,

显而易见啊!

让咱们用位运算。

怎么操作呢?


二、解题

咱们转个思路,

比较大小,

可以利用差值,即 a-b

如果知道 a-b的符号,即 a-b是大于0,还是小于0,或者等于0,

那么就知道二者的大小关系了。

在32位整数中,最高位是符号位,

最高位为1,表示当前数字是负数;

最高位为0,表示当前数字是正数;

利用这个性质,我们通过 '>>' 位移,可以获取数字的符号

进而可以判断。

看看代码。



完整代码:

public class CodingDemo {

    /**
     * TODO: 不做比较,判断大小
     * @param a
     * @param b
     * @return
     */

    private static int getMax(int a, int b){
        int c = a - b;

        //signA 表示a-b的差值符合,如果a-b大于0,则signA=1 signB=0,返回a
        //反之依然
        int signA = sign(c);
        int signB = flip(signA);

        return signA*a + signB*b;
    }

    //获取数字的符号
    private static int sign(int x){
        return flip( ((x >>31)&1) );
    }

    //判断是正数还是负数,因为正数最高位是0,负数最高位是1,
    //此函数做个转换,正数返回1,负数返回0
    private static int flip(int x){
        return x ^ 1;
    }


    public static void main(String[] args) {

        int a = 1;
        int b = 2;
        System.out.println(getMax(a, b));
    }
}

输出:

D:\java\bin\java.exe
2



结束语:
Ok,就是本篇文章的全部内容了。
如果各位有不懂的地方,欢迎发消息给小编,小编会进行详细地解答。
最后,请屏幕前的各位吴彦祖和刘亦菲们,动动你们的小手,给小编一个

文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论