64 lines
1.9 KiB
JavaScript
64 lines
1.9 KiB
JavaScript
/**
|
||
* @param {string} a
|
||
* @param {string} b
|
||
* @return {string}
|
||
*/
|
||
const addBinary = function (a, b) {
|
||
|
||
};
|
||
|
||
/*
|
||
直接利用位运算,只算进位加法,和只算不进位加法,得到得结果求和就是要求得结果,投机
|
||
取巧使用数字快速运算,被大数卡住了,f1只作为思路扩张
|
||
*/
|
||
function f1(a, b) {
|
||
// 将二进制字符串转换为十进制整数
|
||
let x = parseInt(a, 2);
|
||
let y = parseInt(b, 2);
|
||
|
||
// 使用位运算求和
|
||
while (y !== 0) {
|
||
const sum = x ^ y; // 不带进位的加法
|
||
const carry = (x & y) << 1; // 进位
|
||
x = sum;
|
||
y = carry;
|
||
}
|
||
|
||
// 把结果转换成二进制字符串
|
||
return x.toString(2);
|
||
}
|
||
|
||
/*
|
||
模拟加法操作,从个位开始加,由于各位没有人给我进位,所以初始进位carry位0,每一位相加再加上它得进位,
|
||
计算本位和进位,知道没有进位和ab所有位处理完毕
|
||
*/
|
||
function f2(a, b) {
|
||
let i = a.length - 1; // 指针 i 指向 a 的最后一位(最低位)
|
||
let j = b.length - 1; // 指针 j 指向 b 的最后一位(最低位)
|
||
let carry = 0; // 初始化进位为 0
|
||
const res = []; // 用于存储结果的数组(从低位到高位)
|
||
|
||
// 循环条件:只要还有位未处理,或还有进位,就继续
|
||
while (i >= 0 || j >= 0 || carry !== 0) {
|
||
// 取当前位的值,如果越界则视为 0
|
||
const bitA = i >= 0 ? +a[i] : 0;
|
||
const bitB = j >= 0 ? +b[j] : 0;
|
||
|
||
// 本位加法:两个二进制位 + 上一轮进位
|
||
const sum = bitA + bitB + carry;
|
||
|
||
// sum % 2 得到当前位的结果(因为二进制满 2 进 1)
|
||
res.push(sum % 2);
|
||
|
||
// 计算下一轮的进位(如果 sum >= 2 则进位为 1)
|
||
carry = Math.floor(sum / 2);
|
||
|
||
// 移动指针,处理更高位
|
||
i--;
|
||
j--;
|
||
}
|
||
|
||
// 最后结果数组是反着存的,需要翻转后拼接成字符串
|
||
return res.reverse().join('');
|
||
}
|