目录
1,题目
2,代码
2.1转换进制数
2.2模拟加法
3,学习与总结
Math.floor()
模拟加法思路回顾
重点复习巩固 模拟加法的思路和学习位运算;
今天没精力了,先休息
1,题目
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

2,代码
2.1转换进制数
`0b${a}`:这是一个模板字符串,用于构建字符串字面量。在这里,0b是一个前缀,指示随后的数字是二进制格式的。${a}是模板字符串中的插值表达式,它会被变量a的值替换。假设a的值是"1010",那么表达式`0b${a}`的结果将是字符串"0b1010"。BigInt(...):BigInt函数接受一个字符串或数字参数,并返回相应的大整数(BigInt)值。当给定的字符串以0b、0o或0x为前缀时,分别表示该字符串是二进制、八进制或十六进制数,BigInt函数会相应地解析这些字符串为大整数。因此,当你执行
BigInt(`0b${a}`)时,JavaScript首先计算模板字符串`0b${a}`,得到一个形如"0b1010"的字符串,表示二进制数。然后,BigInt函数将这个字符串解析为一个BigInt类型的大整数值。这种方法允许你从二进制字符串直接创建一个
BigInt值,而不需要先将字符串转换为十进制数。这在处理大型二进制数据时特别有用,因为它避免了数值的范围限制和精度问题。
toString(2)是一个非常有用的方法,用于将数字转换成其二进制字符串表示形式。这里的2是.toString()方法的参数,指定了转换的基数(radix),在这种情况下是二进制(base-2)。基数可以是介于2到36之间的任何整数,允许你将数字转换为不同的数制表示,例如十进制、十六进制等。
/*** @param {string} a* @param {string} b* @return {string}*/var addBinary = function(a, b) {const num1 = BigInt(`0b${a}`);const num2 = BigInt(`0b${b}`);return (num1 + num2).toString(2);};
2.2模拟加法
Math.floor()将一个指定的数值向下取整到最接近的整数。这意味着Math.floor()会返回小于或等于给定参数的最大整数。
/*** @param {string} a* @param {string} b* @return {string}*/var addBinary = function(a, b) {let ans = [];let n = Math.max(a.length,b.length);// 记录上一位的进位数值let carry = 0;for(let i = 0;i<n;i++){// 先反转这个代表二进制数字的字符串// 从而低下标对应低位,高下标对应高位。carry += i < a.length ? parseInt(a.charAt(a.length-1-i)) : 0;carry += i < b.length ? parseInt(b.charAt(b.length-1-i)) : 0;ans.push(carry % 2);carry = Math.floor(carry/2);}if(carry > 0){ans.push(1);}// 将数组进行翻转 并将数组转换为字符串return ans.reverse().join('');};
3,学习与总结
Math.floor()
console.log(Math.floor(5.95)); // 输出: 5
console.log(Math.floor(5.05)); // 输出: 5
console.log(Math.floor(5)); // 输出: 5
console.log(Math.floor(-5.05)); // 输出: -6
模拟加法思路回顾
思考点:让各个位置对齐,可以先反转这个代表二进制数字的字符串,则 数组底下标对应低位数,数组高下标对应高位数;
核心代码:
carry += i < a.length ? parseInt(a.charAt(a.length-1-i)) : 0;
carry += i < b.length ? parseInt(b.charAt(b.length-1-i)) : 0;
ans.push(carry % 2);carry = Math.floor(carry/2);
记当前位置对其的两个位为 ai和 bi,
则 每一位的答案为 (carry+ai+bi) mod 2,下一位的进位为 ⌊(carry+ai+bi)/2 ⌋。
作者:力扣官方题解