经典中的经典,领教了!

来源:互联网 发布:什么是网络出版 编辑:程序博客网 时间:2024/05/16 10:33

今晚,一个同事跟我讨论一个关于int类型数字转换的题目:

 

一个数字,int类型的,

现有一个函数,传入三个参数:
参数1 int、二进制位的第几位(从右向左数数,右边第一位为第0位)
参数2 int、将该二进制位修改为0或者1,这个参数只传0或者1
参数3 int、原int类型的数据。

这个函数负责返回转换后的数据

其中第一个参数要求调用者在0~31之间。程序不用关心。
第二个参数只能是0或者1,程序也不用关心会不会传其他的值。

我苦思冥想半天,为一个int转char的问题搞了半天,最后得出了下面的结果:

   public static int change(int i,int j, int k){
    String s=Integer.toBinaryString(k);
    String s1=s.replace(s.charAt(i), Integer.toString(j).toCharArray()[0]);
    return Integer.parseInt(s1,2);
   }

 

 

然后,把这个结果告诉同事,同事说,一般人都会那么写,我两行代码搞定,一个堆对象也不申请,全部利用CPU的二进制运算
public static int swapInt(int bit,int flag,int sourceNum) {
  int temp = (int)Math.pow(2, bit);// 产生一个中间数
  return (flag==1)?sourceNum|temp:sourceNum&(~temp);
 }

 

当我看到这段代码的时候,顿时傻眼了,我在前面的代码中创建了很多个对象,最后才勉强转换了过来,而同事的代码中,没有创建一个对象,使用最基本的Math对象,? :  、|、&、~基本运算符,完成了这样在我看来颇为复杂的运算,甚是让我汗颜啊!

 

谨记于此,细读Java!

 

另记一题:不允许使用if else,不允许使用三目运算符号,不匀速使用>、<、>=、<=、==,要求判定出传入两个数据,返回第一个参数是否大于第二个参数,若是,返回true,若不是,返回false
提示:C语言中1也代表true,0也代表false

 

 public static int getIsBig(int a,int b) {
       return -((b-a)>>31);

 }

 

 

a-b 如果是正数,符号位肯定是0,我右移动32位,左侧补充0,肯定就变成0了,也就是此时a。

考虑两种情况:
1、当b>a的情况,应该返回0。此时b-a肯定为正数,符号位为0,右移动31位,左侧补充0,得到32个0,十进制为0
2、当b不大于a时候,要求返回1,此时b-a为负数,符号位为1,右移动31位,左侧补充1,形成32个1,为-1,将其乘以-1,得到要要的数据。