我已经使用JavaScript开发了一个二进制加法的解决方案。
我的初始目标是通过在JavaScript中复制数字二进制加法器电路中使用的机制来巩固对二进制逻辑的理解(不使用基数转换或位运算符)。
您可以在CodePen上找到我原始项目的可工作版本。
它处理DOM比您可能需要的要多,但当我插入您的数字(使用下面提到的调整),我很高兴看到它起作用了!
可行的解决方案代码 << 这个项目由我的原始项目修改而来,仅包含输出正确答案所需的代码。
此解决方案假定a
和b
是相同长度的字符串。要使用此解决方案,您的输入变量应进行修改:
var a = "000010100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101"
var b = "110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011"
我刚刚在var a
前面用0填充了缺失的数字。
正如你所看到的,我重新创建了二进制加法电路实现中使用的所有组件:
半加器:
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){
const halfAdd1 = halfAdder(a[i],b[i]);
sum = halfAdd1[0]+sum;
carry = halfAdd1[1];
}else{
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
我希望我在这里所做的一些事情也能对你有所帮助!
Number
调用。parseInt
已经返回数字了。 - Bergi