不用比较运算符判断数的大小

题目:给定两个数a和b, 如何不用比较运算符, 返回较大的数

思路:

解法1:用位运算来替代条件运算符;令a-b=c,通过位运算判断c的符号scA,正为1,负为0,scB为scA取反;则较大的数为a*scA+b*scB

解法2:在1的基础上考虑溢出的问题,只有符号不同相减时可能产生溢出;因此判断a较大的情况为 a b符号不同,a为正数或者a b符号相同 a-b=c c的符号为正。

java实现:

public class GetMax {
	//取反0-1,1-0
	public static int flip(int n) {
		return (n^1);
	}
	
	//判断正负,正1,负0
	public static int sign(int n) {
		return flip((n>>31)&1);
	}
	
	public static int getMax1(int a,int b) {
		int c=a-b;
		int scA=sign(c);
		int scB=flip(scA);
		return a*scA+b*scB;
	}
	 
	//防止a,b符号不同时相减溢出
	public static int getMax2(int a,int b) {
		int c=a-b;
		int sa=sign(a);
		int sb=sign(b);
		int sc=sign(c);
		int difSab=sa^sb; // ab符号是否不同
		int sameSab=flip(difSab); //ab符号是否相同
		int returnA=(difSab&sa)+(sameSab&sc);//a大的情况:ab符号不同时,a为正数;a b符号相同时不会溢出,c符号为正
		int returnB=flip(returnA);
		return a*returnA+b*returnB;

	}
	
	public static void main(String[] args) {
		System.out.println(getMax2(2,1));
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值