最近看到一篇文章,原文出处:http://coolshell.cn/articles/1391.html 。题目很简单,反转一个整数的符号,比如把1转成-1。看起来这是一个十分“弱智的”问题,不就是n=-n就可以了么。不过答案可不止这么一个,很多强人还给出了其他一些匪夷所思的答案。本人菜鸟,只能对所给出的部分答案做出分析,加深理解,不能造车,只能依葫芦画瓢了。
方法一:
int x = numberToInvertSign;
boolean pos = x > 0;
for (int i = 0; i < 2 * Math.abs(x); i++) {
if (pos) {
numberToInvertSign--;
} else {
numberToInvertSign++;
}
}
这种方法比较直观,如果x是正数,执行递减操作2x次,反之执行递增操作2x次,即可反转x。还有一个和这种方法类似的解法。
x -= 2 * x;
方法二:
int n = number;
n = (0xffffffff ^ n) + 1;
布尔运算^对应于逻辑运算异或,在命题逻辑中用符号⊕表示。P^Q,当P或者Q为真但不同时为真时,我们说P⊕Q成立。相应地,当P=1且Q=0,或者P=0且Q=1时,P^Q=1。
^ | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 0 |
表1. 异或运算
0xffffffff表示十六进制,与n异或后实际上是对n按位取反,然后加1,即得到相反的数。以下两种解法也是该原理:
n = ~n + 1;
n = ~--n;
方法三:
public int invert(int n) {
String nStr = String.valueOf(n);
if (nStr.startsWith("-")) {
nStr = nStr.replace("-", "");
} else {
nStr = "-" + nStr;
}
return Integer.parseInt(nStr);
}
这种方法比较有趣,把整数n先转换成字符串,如果是'-'号开头,则替换为空字符,否则就在字符串开头加上'-',最后再转换成整形。
如果想要查看更详细的信息,请点击原出处:http://coolshell.cn/articles/1391.html