1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

今回は、前回の続きで、論理演算を使って全加算器をJavaScriptで組んだ話!


問題概要

入力:A, B(1桁のビット), C1(前の桁からの繰り上がり)

出力:C2(次の桁への繰り上がり), S(この桁の合計)
入力:
1 1 1 →
    
出力:
1 1


コード例:全加算器を論理演算でつくる

const rl = require('readline').createInterface({ input: process.stdin });

rl.on('line', (input) => {
    // 入力を数値に変換:A と B は足し算対象、C1 は前の桁からの繰り上がり
    const [A, B, C1] = input.split(' ').map(Number);


    // 半加算器その1:A + B を計算
    const Cx = A & B;       // AとBが両方1なら繰り上がり発生(Carry)
    const Sy = A ^ B;       // AとBの合計(Sum)


    // 半加算器その2:Sy + C1 を計算(前の桁からの繰り上がりを足す)
    const Cy = Sy & C1;     // Sumと繰り上がりが両方1ならさらに繰り上がる
    const S =  Sy ^ C1;     // 最終的な合計(2けた目)


    // 最終的な繰り上がり(C2):2つの繰り上がりをまとめる
    const C2 = Cx | Cy;     // どちらかに繰り上がりがあればOK(ORのほうが安全)


    // 結果を出力:次の桁への繰り上がりC2、現在の桁の合計S
    console.log(C2, S);

    rl.close();
});
  • A & B は両方 1 のときのみ 1 になる → 最初のCarry ( Cx )
  • A ^ B は A と B が異なるとき 1 になる → 中間のSum ( Sy )
  • Sy & C1 は中間 Sum と C1 が両方 1 なら繰り上がる → 追加Carry ( Cy )
  • Sy ^ C1 は合計 → 最終の S(1桁の合計)
  • Cx | Cy は両方どちらかで繰り上がりが出れば 1 → 最終Carry ( C2 )


解説

  • &(AND)で「繰り上がりがあるか」を判定
  • ^(XOR)で「1桁目の合計を算出

これを2段階に分ければ、全加算器 が完成!

計算式で書くと:

Sum = A ⊕ B ⊕ C1
Carry = (A & B) | ((A ⊕ B) & C1)

→ ⊕はJavaScriptだと ^

const Sum = A ^ B ^ C1;
const Carry = (A & B) | ((A ^ B) & C1);

console.log(Carry, Sum);


まとめ

  • 全加算器は半加算器×2+ORでできる
  • & ^ | でロジック回路が作れて楽しい
  • コメントつける理解が進む



📘 僕の失敗談と解決話!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?