我有两个二进制输入,我也返回二进制的加法结果。
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的那帮人。
发布于 2016-12-29 06:02:08
我已经为Javascript中的二进制加法开发了一个解决方案。
我最初的目标是通过复制Javascript中的数字二进制加法器电路(不使用基本转换或位运算符)来巩固我对二进制逻辑的理解。
您可以在CodePen上找到我最初项目的工作版本。
它比您可能需要的DOM做的更多,但是当我插入您的数字时(下面提到了一些调整),我很高兴看到它起作用了!
工作解决方案代码 <<这个项目是从我的原始项目中修改的,只包含输出正确答案所需的代码。
此解决方案假定a和b是长度相同的字符串。若要使用此解决方案,应将输入变量修改为:
var a = "000010100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101"
var b = "110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011"(我刚刚用零填写了var a前面缺失的数字。)
如您所见,我重新创建了二进制加法器电路的物理实现中使用的所有组件:
半Adder:
function halfAdder(a, b){
const sum = xor(a,b);
const carry = and(a,b);
return [sum, carry];
}完全加法器:
function fullAdder(a, b, carry){
halfAdd = halfAdder(a,b);
const sum = xor(carry, halfAdd[0]);
carry = and(carry, halfAdd[0]);
carry = or(carry, halfAdd[1]);
return [sum, carry];
}逻辑门:
function xor(a, b){return (a === b ? 0 : 1);}
function and(a, b){return a == 1 && b == 1 ? 1 : 0;}
function or(a, b){return (a || b);}主要职能:
function addBinary(a, b){
let sum = '';
let carry = '';
for(var i = a.length-1;i>=0; i--){
if(i == a.length-1){
//half add the first pair
const halfAdd1 = halfAdder(a[i],b[i]);
sum = halfAdd1[0]+sum;
carry = halfAdd1[1];
}else{
//full add the rest
const fullAdd = fullAdder(a[i],b[i],carry);
sum = fullAdd[0]+sum;
carry = fullAdd[1];
}
}
return carry ? carry + sum : sum;
}那么,addBinary(a,b)会给出正确的答案!
var a = "000010100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101"
var b = "110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011"
var answer = "110111101100010011000101110110100000011101000101011001000011011000001100011110011010010011000000000";
console.log(addBinary(a, b) == answer); //true我希望我在这里所做的一些工作也能对你有用!
发布于 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";
发布于 2017-02-17 19:47:52
忘记Javascript的精确操作,想想如何在数学中加一个二进制。
例如,11 + 10。
首先,我们应该从右到左开始。现在我们得到1 + 0 = 1之后,我们转移到下一个。1 + 1 = 10如果我们使用Javascript,如何得到结果。
我们知道,Mod可以得到其余的号码,Division可以得到进位。在十进制中,我们得到了1 + 1 = 2,如何将2转换为10。我们可以用
result % 2 // we can get single digit
result / 2 | 0 // we can get tens digit, `| 0` can remove decimal.现在我们可以把两个字符串连在一起了。
BinaryNumber = result / 2 | 0 + result % 2 + '' // string concat所以我们的最后代码可以是:
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
var i = a.length - 1;
var j = b.length - 1;
var carry = 0;
var result = "";
while(i >= 0 || j >= 0) {
var m = i < 0 ? 0 : a[i] | 0;
var n = j < 0 ? 0 : b[j] | 0;
carry += m + n; // sum of two digits
result = carry % 2 + result; // string concat
carry = carry / 2 | 0; // remove decimals, 1 / 2 = 0.5, only get 0
i--;
j--;
}
if(carry !== 0) {
result = carry + result;
}
return result;
};https://stackoverflow.com/questions/40353000
复制相似问题