rt ,郁闷的是int是32位补码,试了半天竟想不出怎么办,大侠们帮我想想吧,谢谢了。(不要if-else)

解决方案 »

  1.   

    不要ifesle
    那三目运算可不可以
    a>=0?a:-a
      

  2.   

    public class Test {
        public static void main(String[] args) {
            System.out.println(abs(245));
            System.out.println(abs(-245));
            System.out.println(abs(1234213655));
            System.out.println(abs(-1234213655));
            
            System.out.println(abs(0));
            System.out.printf("%32s\n", Integer.toBinaryString(0));
            
            System.out.println(Integer.MAX_VALUE);
            System.out.println(abs(Integer.MAX_VALUE));
            System.out.printf("%32s\n", Integer.toBinaryString(Integer.MAX_VALUE));
            
            System.out.println(Integer.MIN_VALUE + 1);
            System.out.println(abs(Integer.MIN_VALUE + 1));
            System.out.printf("%32s\n", Integer.toBinaryString(Integer.MIN_VALUE + 1));
        }    public static int abs(int val) {
            // 看上去是够累的
            return (((val & (~0 << 31)) >>> 31) == 1) ? ((~val) + 1) & (~(~0 << 31)) : val;
        }
    }
      

  3.   

     public static int getABS(int i){
         int tag = i>>>31;
         int b = 0;
            boolean bool = ((tag == 1) && (b == (i = (~(i - 1)))));
         return i;
        }试一下吧~
      

  4.   

    public static int abs(int i) {
    int mask = i >> 31;
    return (mask & (~i + 1)) | (~mask & i);
    }
      

  5.   


    // 10> 取int型变量i的绝对值  
    public static int getABS(int i) {  
        int sign = i >> 31;  
        return (i + sign) ^ sign; // 或 (i ^ sign) - sign  
    }
      

  6.   

    我告诉你有什么价值吧,在每bt内存必争的手游开发中,位运算要比Math.abs节省巨多内存(特别是在线程中要不断的求绝对值的情况。)
      

  7.   

    应该不是内存差异吧,你可以比较一下效率从0x80000000(最小int型)到0x7fffffff(最大int型)循环执行,在我现在的机器上Math.abs需要5秒多,而#12和#13的代码(我只测试了这两个)都是2.4秒左右,#13的代码应该比我#12的更好,至少运算数要少一些