Problem 1:
Description: Write a function that add two numbers A and B. You should not use +
or any arithmetic operators.
a与b均为32位整数。不用加法运算符的话考虑按位计算。
首先 a+b如果有进位时,a+b = 不考虑进位时的运算结果+ 进位值
二进制加法若不考虑进位,有以下式子:
1 + 1 = 0;1 + 0 = 1; 0 + 0 = 0; 0 + 1 = 1;
恰好与^(按位异或)结果一致:
1^1 = 0; 1^0=1;0^0 = 0; 0^1 = 1;
那么可以用^计算两数相加不考虑进位时的运算结果。
同时,若只考虑是否有进位,我们有
1+1 = 1;1+ 0 = 0; 0+0 = 0; 0+1 = 0;
和&(按位与)的结果一致:
1&1 =1 ; 1&0 = 0; 0&0 = 0; 0&1 =0;
进位对结果的实际影响需要由按位左移一位(<<1)完成,也就是(a&b)<<1, 代表两数相加每位进位代表的值。
a+b = a^b+ (a&b)<<1;
中间的加号又可以通过此方法计算,所以此题需要用到迭代,循环到进位值为0则结束。也就是a&b为0时,a+b = a^b,循环结束。
/*看到一篇文章也提到了用指针来进行运算的方法,
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
int aplusb(int a, int b) {
// write your code here
int a_ = a^b;
int b_ = (a&b)<<1;
while(b){
a_ = a^b;
b_ = (a&b)<<1;
a = a_;
b = b_;
}
return a_;
}
long aplusb(int a, int b) { char * str=(char *)a; return (long)(&str[b]); }在c语言中,数组名就是数组的首地址,也就是a == &a [0];
对数组名取地址时,数组名代表数组这个变量的变量名,也就是&a代表数组这个变量的地址。输出a与&a是一样的,但是a+1与&a+1则不同因为步长不同。
&str [b]获取的是第b+1个元素的地址,等于数组元素首地址+b* 存储单元的长度(char数组为1个字节,int数组为4个字节)
在编译过程中,
int a = 2; int b = 5;
char* s = (char*) a;
s的地址为0x00000002,若输出s ,s = 2。
因此s[b]的地址为首地址加 b*存储单元(char*为1),因此可算出两数相加的值。