12_2求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for
转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253932.html
声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明。谢谢。
题目:求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for, 内嵌汇编递归第三方函数。
在网上看到一些网友给出了一些思路,比我自己想到的要好,再此深表感谢,实现如下:
java实现源码:
1 package com.interview; 2 /** 3 * 题目:求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for, 4 * 内嵌汇编递归第三方函数。 5 * @author wjh 6 * 7 */ 8 public class _12_2MinData { 9 10 public static void main(String[] args) { 11 int a= 255; 12 int b= 30; 13 System.out.println(a+"与"+b+"中较小的数为:"+min(452, 28)); 14 } 15 16 //比较的函数,用于返回两个整数的较小值 17 private static int min(int a, int b) 18 { 19 int sum = a + b; //先算两者的和 20 b = a - b; 21 //1)java 中int类型的数据占4字节,下面的size=4 22 //2)如果a > b,那么得到b=a-b是正值,那么下一行(b>>(size*8 - 1))将等于0,否则为-1 23 //那么该语句可简化为a+=b*0(b为a和b的差值),因此得到a就是较大值 24 //3)如果a < b,根据上面的解释,那么(b>>(size*8 - 1))将等于-1, 25 //那么该语句可简化为a+=b*(-1)(b为a和b的差值),因此得到a就是较大值; 26 a += b * (b >> 4 * 8 - 1); 27 return sum - a; //用和减去较大值,得到较小值 28 } 29 }
运行结果:
255与30中较小的数为:28