反转一个整数的多种解法分析

 

    最近看到一篇文章,原文出处: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。

 

 

^01
001
110

 

表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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值