algorighm/leetcode/中等/两整数之和.js
2024-05-19 03:36:36 +08:00

67 lines
2.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* leetcode 371
给你两个整数 a 和 b ,不使用 运算符 + 和 - 计算并返回两整数之和。
示例 1
输入a = 1, b = 2
输出3
示例 2
输入a = 2, b = 3
输出5
提示:
-1000 <= a, b <= 1000
*/
/*
在计算机中,反码、补码和原码是用来表示整数的不同编码方式:
原码即数字的真实表现形式也就是它的符号位加上其二进制表示形式。正数的原码与其二进制表示形式相同负数的原码最高位为1其余位为其绝对值的二进制表示形式。
反码负数的反码是其原码除符号位外各位取反0变11变0得到的结果。正数的反码与其原码相同。
补码负数的补码是其反码加1得到的结果。正数的补码与其原码相同。
举个例子:
原码:+5 的原码是 00000101-5 的原码是 10000101。
反码:+5 的反码与其原码相同,即 00000101-5 的反码是 11111010。
补码:+5 的补码与其原码相同,即 00000101-5 的补码是其反码加1得到的结果即 11111011。
*/
const getSum = (a, b) => {
while (b !== 0) {
const carry = (a & b) << 1;
a ^= b;
b = carry;
}
return a;
};
const getSum2 = (a, b) => {
if (b === 0) return a; // 如果进位结果为0就结束递归
const carry = (a & b) << 1;
const c = a ^ b;
getSum2(c, carry);
return '';
};
/**
思考:
为什么这样就能实现加法运算,我们在小学的时候做加法运算的时候会列竖式,如果是没有进位的加法我们可以
很快的做出来比如说123+123想都不要想就知道是246但是如果结果里面有进位那么就不能一眼看出来比如
说 456+645 这个结果一眼是看不出来的经过计算我们可以知道他的结果是1101首先我们从个位开始加6+5
等于1向前面进一位之后再5+4+1得到结果10向前进一位之后4+6+1得到结果11🔎进一位这里面我们总共进了
三次位,所以只要把把没进位的数和进位的数相加得到的结果不就是结果吗?
4 5 6 4 5 6
6 4 5 6 4 5
-------- ---------
0 9 1 1 1 1 1
*/
console.log(getSum(1, 0));
console.log(getSum2(2, 0));