我已经开发了一种在 Javascript 中进行二进制加法的解决方案。
我最初的目标是通过复制 Javascript 中数字二进制加法器电路中使用的机制来巩固我对二进制逻辑的理解(不使用基本转换或位运算符)。
您可以在 CodePen 上找到我的原始项目的工作版本。
它对 DOM 所做的工作比您可能需要的要多得多,但是当我插入您的数字时(通过下面提到的调整),我很高兴看到它起作用了!
Working Solution Code
此解决方案假定a 和b 是长度相同的字符串。要使用此解决方案,您的输入变量应修改为:
var a = "000010100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101"
var b = "110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011"
(我只是用零填充了var a前面缺少的数字。)
如您所见,我重新创建了二进制加法器电路的物理实现中使用的所有组件:
半加法器:
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
我希望我在这里所做的一些事情也对你有用!