JAVA怎么用位运算求一个int的绝对值 rt ,郁闷的是int是32位补码,试了半天竟想不出怎么办,大侠们帮我想想吧,谢谢了。(不要if-else) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不要ifesle那三目运算可不可以a>=0?a:-a 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; }} public static int getABS(int i){ int tag = i>>>31; int b = 0; boolean bool = ((tag == 1) && (b == (i = (~(i - 1))))); return i; }试一下吧~ public static int abs(int i) { int mask = i >> 31; return (mask & (~i + 1)) | (~mask & i);} // 10> 取int型变量i的绝对值 public static int getABS(int i) { int sign = i >> 31; return (i + sign) ^ sign; // 或 (i ^ sign) - sign } 我告诉你有什么价值吧,在每bt内存必争的手游开发中,位运算要比Math.abs节省巨多内存(特别是在线程中要不断的求绝对值的情况。) 应该不是内存差异吧,你可以比较一下效率从0x80000000(最小int型)到0x7fffffff(最大int型)循环执行,在我现在的机器上Math.abs需要5秒多,而#12和#13的代码(我只测试了这两个)都是2.4秒左右,#13的代码应该比我#12的更好,至少运算数要少一些 oracle语法严重问题 出现异常 ???? 一个简单的问题>>>>传值 java怎么打开FTP服务器上的文件? 2个方法的结果怎么不一样 能帮说明一下么? 如何比较两个SQL查询语句产生的结果集是否相同??? 不用length()方法如何得到字符串变量的大小? JNI使用入门问题,请指点 请教String类型的转义字符表达与SQL语句。 jdbc在何处下载? 抽象概念、它的优点与java实现【求教】 找不到集合的get方法
那三目运算可不可以
a>=0?a:-a
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;
}
}
int tag = i>>>31;
int b = 0;
boolean bool = ((tag == 1) && (b == (i = (~(i - 1)))));
return i;
}试一下吧~
int mask = i >> 31;
return (mask & (~i + 1)) | (~mask & i);
}
// 10> 取int型变量i的绝对值
public static int getABS(int i) {
int sign = i >> 31;
return (i + sign) ^ sign; // 或 (i ^ sign) - sign
}