我有两个二进制输入,我也返回二进制的加法结果。
var addBinary = function(a, b) {
var dec = Number(parseInt(a, 2)) + Number(parseInt(b, 2));
return dec.toString(2);
};对于一些疯狂的大二进制,比如
A= 10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101 B= 110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011
我在输出
110111101100010011000101110110100000011101000101011000000000000000000000000000000000000000000000000
假设的正确输出是
110111101100010011000101110110100000011101000101011001000011011000001100011110011010010011000000000
是因为溢出吗?如果是,那么Javascript中对二进制加法溢出的限制是什么?对不起1和0的那帮人。
发布于 2018-09-17 16:56:46
以下是我对此的看法:
逻辑很简单,就像小学里教的一样,从最右边的数字开始:我把第一个数字的最后一个数字和第二个数字的最后一个数字相加,然后保持下一轮的进位。
在每一轮中(在while内),我正确地修剪两个数字,例如:
// number
1101 -> 110
// The math is simple: 1101/10|0 (divide by 10 and convert to integer)输入和输出是Strings,以克服JS最大整数限制,其中字符串的长度可以大得多。
完整代码:
function binaryAddition(a,b){
var result = "",
carry = 0
while(a || b || carry){
let sum = +a.slice(-1) + +b.slice(-1) + carry // get last digit from each number and sum
if( sum > 1 ){
result = sum%2 + result
carry = 1
}
else{
result = sum + result
carry = 0
}
// trim last digit (110 -> 11)
a = a.slice(0, -1)
b = b.slice(0, -1)
}
return result
}
// Tests
[
["0","0"],
["1","1"],
["1","0"],
["0","1"],
["10","1"],
["11","1"],
["10","10"],
["111","111"],
["1010","11"]
].forEach(numbers =>
document.write(
numbers[0] + " + " +
numbers[1] + " = " +
binaryAddition(numbers[0], numbers[1]) +
" <mark> (" +
parseInt(numbers[0], 2) + " + " +
parseInt(numbers[1], 2) + " = " +
parseInt(binaryAddition(numbers[0], numbers[1]),2) +
")</mark><br>"
)
)
document.body.style="font:16px monospace";
https://stackoverflow.com/questions/40353000
复制相似问题