题目描述:
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
核心思想:
参照我们对十进制数的计算方式,设定数字进位门槛与进位标记。
我们用%2的方式实现对进位门槛的设定,只要一个数≥2,就会被取余(思想同9+1≥10,第二位进一,第一位取0)。例如2,这一位在%2后等于0,进1归0。
其次我们用carry标记是否进位,这和我们常用的满10进1的思想是一样的。现在,一个数只要≥2,例如3,/2后等于1,也就是满2进1。2也好,3也好,/2商不变,所以我们取商。就相当于我们将“进1”保存在了一个变量中。进行下一位的运算时,直接加进去即可。
代码实现:
var addBinary = function(a, b) {
var res = "";
var carry = 0;
var sum = 0;
for(var i=a.length-1, j=b.length-1; i>=0||j>=0; i--, j--){
sum = carry;
sum += (i>=0 ? a.charAt(i)*1 : 0);
sum += (j>=0 ? b.charAt(j)*1 : 0);
res += sum%2;
carry = Math.floor(sum/2);
}
res+=(carry==1)?carry:"";
return res.split('').reverse().join('');
};
外挂写法:
var addBinary = function(a, b) {
return (BigInt(`0b${a}`) + BigInt(`0b${b}`)).toString(2)
};
该写法没什么特别奇妙的地方,仅仅只是将二进制数转化为十进制大数,然后进行相加,再转化为二进制数字对应的字符串而已。BigInt仅仅就是解决了对数字大小的限制。
BigInt也是一种数值类型,其所涵盖数字的大小范围远比Number类型的数字大,BigInt类型的数字有一个特征,其末尾带一个n。
console.log(10n) // 10n
console.log(typeof 10n) // bigint
console.log(10n == 10) // true
console.log(0b10n == 2) // true
console.log(0b10n === 2) // false 毕竟类型不一样,前者是bigint类型,而后者是number类型
console.log( 0b10000000000000000000000000000000000011n == 137438953475) // true
BigInt用法(或者说将一个任意进制的数字转化为BigInt类型数字的方法):
1. 调用BigInt()函数
Big(binary/octal/hex)。注意,传递给BigInt的参数,其中,二进制数要以0b开头,八进制以0o开头,十六进制以0x开头。其次,不支持旧的八进制语法!
例如:var s1 = '111110'; console.log( BigInt(`0b${s1}`) ); // 62n 这种方式传递的参数末尾不能带n
或者是:console.log( BigInt(0b111110) ); // 62n 这种方式传递的参数末尾可以带n
console.log( 0400000000000000003n ); // → SyntaxError
2. 直接以各进制开头标志,+n结尾
例如我们打印:console.log( 0b100000000000000000000000000000000000000000000000000011n); // 9007199254740995n,就可以直接打印出其对应十进制大数。
注意:当我们想要拼接出一个bigint类型的大数时,必须要使用BigInt函数!
例如:var s1 = '111110'; console.log( BigInt(`0b${s1}`) ); // 62n
var s1 = '111110'; console.log( `0b${s1}n` ); // 0b111110n
推荐文章: