小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
371. 两整数之和
题目描述
给你两个整数
a和b,不使用 运算符+和-,计算并返回两整数之和
示例:
输入:a = 1, b = 2
输出:3
思路1:位运算
主要步骤:
- 先不考虑进位,用异或实现不考虑进位时的求和a^b
- 进位不为0时,用与运算+左移一位来实现进位
(a & b) << 1 - 将步骤1异或运算的结果和步骤2得到的进位进行求和,(求和就是重复步骤1和2);
- 直到进位为0时,返回步骤1的异或运算结果。
实现1
const getSum = (a, b) => {
while (b) {
// 进位
const c = (a & b) << 1;
// 不考虑进位的加法
a ^= b;
// 将进位赋值给b
b = c;
}
return a;
};
实现2
const getSum = (a, b) => {
if (!b) return a;
return getSum(a ^ b, (a & b) << 1);
};
实现2简化
const getSum = (a, b) => (b ? getSum(a ^ b, (a & b) << 1) : a);
思路2:乘除法+对数
分析:**+和-不行,和/还是可以的,对数也是可以的*,虽然乘除的底层还是加减,所以这里只是参考
var getSum = function(a, b) {
let x = Math.pow(2, a), y = Math.pow(2, b);
let s = x * y;
return Math.log2(s);
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤