笔记:
1. x==0?y:x => if(x==0){
return y;
}
else return x;
2. 通过测试,该加法计算方法对于负数也能够完美实现,但是在计算机语言中负数是以补码的形式存放的,也就是说一个正数的相反数就是该正数的二进制形式取反加一。
例如:对于字节型的1,在内存中的存放形式是0000 0001,而-1则是1的反码(1111 1110)加上1,即1111 1111。对于这样形式的负数仍能以上面的实现原理来理解吗,
不把负数当做一个负数,而把整个数当做一个没有负数标记位的正数。
然后,我们可以取一个数,然后将其取反,不难知道,将这个数和其反码相加的结果永远是全部为1,例如0011 0101与1100 1010加起来就是1111 1111。如果这个数据类型有n位,那么用它表示的一个整数和它的反码的和的值可以用2^n-1的形式二进制形式来表示,即a+~a=2^-1。而我们知道相反数数的表示形式其实是反码加一,所以对于一个数a,其相反数-a的表示形式就是:-a=(2^n-1-a)+1=2^n-a 。
接着,当我们把负数当做正数来看的话,对于两个整数a和b,我们假设它们的最高位都为0,即我们所认识的正数,那么a+b=add(a,b)。那么当我们要计算a的相反数和b的和的时候,我们可以先得到a的相反数的表现形式2^n-a,但是我们把它看做一个正数,然后调用该方法add(2^n-a,b) ,计算的结果本来应当是是2^n-a+b的二进制形式。
1.当b>a的时候该结果的值已经大于2^n-1,结果是向第n+1位进一,但是计算机是不会保存这个一的,因为该数据类型只有n位,于是得到的二进制表现形式其实是2^n-a+b-2^n即b-a的二进制表现形式,显然这个数就是-a和b的和的值。
second point from CSDN 一眼认定public class Solution {
/**
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
public int aplusb(int a, int b) {
// write your code here
while(b != 0){
int _a = a^b;
int _b = (a&b)<<1;
a = _a;
b = _b;
}
return a;
}
}
网友评论