A+B按位操作实现

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),因此可算出两数相加的值。

猜你喜欢

转载自blog.csdn.net/gulaixiangjuejue/article/details/79112578
A+B