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

昨天的文章:
不知道各位掌握了没,
那是一道位运算的题目,利用的就是异或运算 '^'
属于位运算题目中,
非常非常常用的一种技巧。
今天再看一道位运算的题目,
有点类似。
一、屏幕前的吴彦祖和刘亦菲们,请听题

这道题,
不能使用比较运算及比较函数,
显而易见啊!
让咱们用位运算。
怎么操作呢?
二、解题
咱们转个思路,
比较大小,
可以利用差值,即 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

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




