目录
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 ⌋。
作者:力扣官方题解