バイナリで2つの入力があり、加算結果もバイナリで返します。
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の束でごめんなさい。
私はJavascriptでバイナリ加算のソリューションを開発しました。
私の最初の目標は、Javascriptのデジタルバイナリ加算回路で使用されるメカニズムを複製することにより、バイナリロジックの理解を固めることでした(基数変換やビット演算子は使用されません)。
私の元のプロジェクトの作業バージョンはCodePenにあります。
おそらく必要以上にDOMを使って多くのことを行っていますが、番号を(以下で説明するように)プラグインしたとき、それが機能することを嬉しく思いました!
実用的なソリューションコード<<このプロジェクトは私の元のプロジェクトから変更されており、正解を出力するために必要なコードのみが含まれています。
このソリューションは、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
私がここで行ったことのいくつかがあなたにも役立つことを願っています!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加