剑指offer(65)
作者:互联网
剑指offer(65)
剑指 Offer 65. 不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a
,b
均可能是负数或 0- 结果不会溢出 32 位整数
根据题目可以知道是想让我们进行位运算,那么位运算怎么进行加法呢
一般 s=a+b -》s=n+c 因为是二进制 那么就是两个数不进位的和加上进位的值
而不进位的和就是异或运算 即s=a^b;而进位则是c=(a&b)<<1两个位上的数都是1才有进位然后进位要左移一位才是要加上的位置,那么不断的循环,直到最后进位是0了,所有位都不进位,那么最后答案就是不进位和了
class Solution {
public:
int add(int a, int b) {
//因为计算机内部是用补码来计算的 所以正负都一样
//使用二进制 使用异或表示进位
while(b != 0) { // 当进位为 0 时跳出
int c = (a & b) ; // c = 进位
c=(unsigned)c<<1;//可能越界 就不置符号
a ^= b; // a = 非进位和
b = c; // b = 进位
}
return a;
}
};
标签:运算,offer,int,异或,65,进位 来源: https://www.cnblogs.com/BailanZ/p/16244879.html