首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript:添加两个二进制数字(返回二进制)

Javascript:添加两个二进制数字(返回二进制)
EN

Stack Overflow用户
提问于 2016-11-01 01:39:02
回答 16查看 32.5K关注 0票数 18

我有两个二进制输入,我也返回二进制的加法结果。

代码语言:javascript
运行
复制
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的那帮人。

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2016-12-29 06:02:08

我已经为Javascript中的二进制加法开发了一个解决方案。

我最初的目标是通过复制Javascript中的数字二进制加法器电路(不使用基本转换或位运算符)来巩固我对二进制逻辑的理解。

您可以在CodePen上找到我最初项目的工作版本。

它比您可能需要的DOM做的更多,但是当我插入您的数字时(下面提到了一些调整),我很高兴看到它起作用了!

工作解决方案代码 <<这个项目是从我的原始项目中修改的,只包含输出正确答案所需的代码。

此解决方案假定ab是长度相同的字符串。若要使用此解决方案,应将输入变量修改为:

代码语言:javascript
运行
复制
var a = "000010100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101"

var b = "110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011"

(我刚刚用零填写了var a前面缺失的数字。)

如您所见,我重新创建了二进制加法器电路的物理实现中使用的所有组件:

半Adder:

代码语言:javascript
运行
复制
function halfAdder(a, b){
  const sum = xor(a,b);
  const carry = and(a,b);
  return [sum, carry];
}

完全加法器:

代码语言:javascript
运行
复制
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];
}

逻辑门:

代码语言:javascript
运行
复制
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);}

主要职能:

代码语言:javascript
运行
复制
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)会给出正确的答案!

代码语言:javascript
运行
复制
var a = "000010100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101"
var b = "110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011"
var answer = "110111101100010011000101110110100000011101000101011001000011011000001100011110011010010011000000000";

console.log(addBinary(a, b) == answer); //true

我希望我在这里所做的一些工作也能对你有用!

票数 25
EN

Stack Overflow用户

发布于 2018-09-17 16:56:46

以下是我对此的看法:

逻辑很简单,就像小学里教的一样,从最右边的数字开始:我把第一个数字的最后一个数字和第二个数字的最后一个数字相加,然后保持下一轮的进位。

在每一轮中(在while内),我正确地修剪两个数字,例如:

代码语言:javascript
运行
复制
// number
1101 -> 110
// The math is simple: 1101/10|0 (divide by 10 and convert to integer)

输入和输出是Strings,以克服JS最大整数限制,其中字符串的长度可以大得多。

完整代码:

代码语言:javascript
运行
复制
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";

票数 9
EN

Stack Overflow用户

发布于 2017-02-17 19:47:52

忘记Javascript的精确操作,想想如何在数学中加一个二进制。

例如,11 + 10

首先,我们应该从右到左开始。现在我们得到1 + 0 = 1之后,我们转移到下一个。1 + 1 = 10如果我们使用Javascript,如何得到结果。

我们知道,Mod可以得到其余的号码,Division可以得到进位。在十进制中,我们得到了1 + 1 = 2,如何将2转换为10。我们可以用

代码语言:javascript
运行
复制
result % 2   // we can get single digit
result / 2 | 0   // we can get tens digit, `| 0` can remove decimal.

现在我们可以把两个字符串连在一起了。

代码语言:javascript
运行
复制
BinaryNumber = result / 2 | 0 + result % 2 + ''  // string concat

所以我们的最后代码可以是:

代码语言:javascript
运行
复制
/**
 * @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;
};
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40353000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档