剑指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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。