问题如题:要求:1、不得使用任何API,如Math.abs()等。
2、不得使用判断语句,如if、for、while、switch、?:等。
3、不得使用比较语句,如:==、<=、>=、!=、<、>等。请看清要求。

解决方案 »

  1.   

     i = (1 - (i>>>31)) * i - (i>>>31) * i
      

  2.   

    上面的都好短。
    public class TestAbs {
    public static void main(String args[]){
    int temp = - 8;
    int out = temp;
    temp = temp >> 31;
                    out = out ^ temp;
                    out = out - temp;
                    System.out.println(out);
    }
    }
      

  3.   

    贴好看点public class TestAbs {
    public static void main(String args[]){
    int temp = - 8;
    int out = temp;
    temp = temp >> 31;
            out = out ^ temp;
            out = out - temp;
            System.out.println(out);
    }
    }
      

  4.   


    int i=-?;
    int j=(i*i)/(-i);
    System.out.println(j);
      

  5.   

    在简单些就是int i=-?;
    int j=(-i);
    System.out.println(j);
      

  6.   

      public static int abs(int num) {
        return num * (1 - ((num >>> 31)<<1));
      }
      

  7.   

    1,3,13楼的一样的.类似的还有:num*(1-((num&0X80000000)>>>30))略有不同的是:
    (num^-(num>>>31))+(num>>>31)
      

  8.   

    9楼的相当于:
    (num^(num>>31))-(num>>31)
      

  9.   


     没必要这样整人吧···
     1:异或
     2:移位
     3:转String 用indexOf(“-”)
      在SubString截取 再转回去
      
      

  10.   

    个人认为9楼的方法是最好的.
    我把原理说一下.
    num>>31:如果num是负数,num>>31的结果是-1.如果num是非负数,num>>31为0num^(num>>31):num如果是负数,相当于num^-1(-1在内存是0xffffffff),结果就是把num各位取反,再加1就是原来负数对应的正数.加1操作是由-(num>>>31)实现的.这个办法是负数在内存中的存贮是补码形式,这个原理的体现.
    当num为正数时,num^(num>>31)相当于num^0,结果就是num.再-(num>>31),也就是-0.结果还是num.借助于一个中间变量,可以只用两个位运算和一个减法运算来完成题目的要求。也借助,也可以用三个位运算和一个减运算来完成。
      

  11.   


    我来解释一下吧:num>>>31 得到的是num的符号位。num为负则num>>>31=0;否则num>>>31=1;(num>>>31)<<1 相当于将 num>>>31 乘以2.1- ((num>>>31) < <1) 的作用是将 ((num>>>31) < <1)由0变为1,或者由1变为-1;经过1- ((num>>>31) < <1) 的变换后,如果Num为负,则表达式的结果为-1;否则为1。num* (1- ((num>>>31) < <1))的意思也就明确了……
      

  12.   

    我觉得你们真奇怪
    他规定中可以用+,-,*,/的
    那么就很简单了
    int i=-9;
    int j=-i;
    这样不就行了?为什么还要位移?
      

  13.   


    public class Test {
    public static void main(String[] args) {
    int i=-2;
    i = i<<1>>1;
    System.out.println(i);
    }
    }
      

  14.   

    都说的差不多了,那换点别的。   int test=-9;
           String str=String.valueOf(test);
           str=str.startsWith("-")?str.split("-")[1]:str;
           test=Integer.parseInt(str);
           System.out.println(test);
      

  15.   

    囧,我只知道Math.abs()这样绝对值,学习
      

  16.   


    public static int myabs(int num){
     return (num < 0) ? -num : num;
    }
    只会这个...  汗..  
      

  17.   


    public class AbsCal { public static void main(String[] args) {
    for(int i=-10; i<10; i++)
    System.out.println("abs("+i+") = "+abs(i));
    }

    public static int abs(int num) {
    return ~num +1;
    }}
      

  18.   

    都在整位运算么?如果看过 Hacker's Delight 这本书的话,可能会发觉原来根本就不懂位运算!
      

  19.   

    Math.abs() 怎么实现这个滴列?
    不会是用了位运算吧?
      

  20.   

    i * (( i >> 31 ) | 1 )
      

  21.   

    如果 i 为负数 : i >> 31 结果 为 -1,-1 | 1 = -1, i * -1 结果为正i.
    如果 i 为正数 : i >> 31 结果为 0, 0 | 1 = 1, i * 1 结果为正i.
    如果 i 为0 : 结果肯定是0啦。