半加算器と全加算器のシミュレーション – プログラミング – Home

半加算器と全加算器のシミュレーション
 
通知
すべてクリア

[解決済] 半加算器と全加算器のシミュレーション


さわし
 さわし
(@さわし)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

C++で「半加算器と全加算器」のプログラミングを教えてもらえないでしょうか?
初心者なので全然わかりません。
よろしくお願いします。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

#include <utility>
#include <iostream>
#include <iomanip>

typedef std::pair<bool,bool> argument;

inline bool xor(argument x) {
return x.first != x.second;
}

inline bool and(argument x) {
return x.first && x.second;
}

inline argument half_add(argument x) {
return argument(xor(x), and(x));
}

void evaluate(bool a, bool b) {
std::cout << std::boolalpha;
argument result = half_add(argument(a,b));
std::cout << std::setw(5) << a << +
<< std::setw(5) << b << =
<< std::setw(5) << result.first << (carry =
<< std::setw(5) << result.second << )
<< std::endl;
}

int main() {
evaluate(false, false);
evaluate( true, false);
evaluate(false, true);
evaluate( true, true);
return 0;
}

/* 実行結果
false + false = false (carry = false)
true + false = true (carry = false)
false + true = true (carry = false)
true + true = false (carry = true)
*/

full_adder は half_adder 2個と xor 1個でできるはず。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

> full_adder は half_adder 2個と xor 1個でできるはず。

おっとマチガイ。half_adder 2個と or 1個でできるはず。


返信引用
ぽち
 ぽち
(@ぽち)
ゲスト
結合: 22年前
投稿: 24
 

xorやandは予約語だったように思いますが...


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

え? だったらなぜコンパイルできたんやろ?


返信引用
ぽち
 ぽち
(@ぽち)
ゲスト
結合: 22年前
投稿: 24
 

gcc-3.2だと、

ファイル名:7: parse error before ~^' token
ファイル名:11: parse error before ~&&' token
ファイル名: In function ~argument half_add(std::pair<bool, bool>)':
ファイル名:16: parse error before ~^' token

となります。
C言語のiso646.hで定義されていたマクロはすべて予約語になったはずです。

もしかして、Visual C++を使われたとか?


返信引用
ぽち
 ぽち
(@ぽち)
ゲスト
結合: 22年前
投稿: 24
 

> もしかして、Visual C++を使われたとか?

よく考えると、Visual C++の掲示板なので、Visual C++でコンパイルできればOKという
見方もありますね。
失礼しました。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

なるほど、そういうことですか。了解しました。
logical_xor とかにしとけばよかったかな。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

改版:

#include <utility>
#include <iostream>
#include <iomanip>

typedef std::pair<bool,bool> result_type;

inline bool logical_xor(bool x, bool y) { return x != y; }
inline bool logical_and(bool x, bool y) { return x && y; }
inline bool logical_or(bool x, bool y) { return x || y; }

inline result_type half_add(bool x, bool y) {
return result_type(logical_xor(x,y), logical_and(x,y));
}

// ----------------------------------------

void half_evaluate(bool a, bool b) {
std::cout << std::boolalpha;
result_type result = half_add(a, b);
std::cout << std::setw(5) << a << +
<< std::setw(5) << b << =
<< std::setw(5) << result.first << (carry =
<< std::setw(5) << result.second << )
<< std::endl;
}

int main() {
std::cout << half adder: << std::endl;
half_evaluate(false, false);
half_evaluate( true, false);
half_evaluate(false, true);
half_evaluate( true, true);
return 0;
}


返信引用
さわし
 さわし
(@さわし)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

επιστημηさん、ぽちさん、どうもありがとうございました。
大変参考になりました。僕のような素人に知己会って頂いて感謝です。


返信引用
さわし
 さわし
(@さわし)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

本当に申し訳ないのですが、マルチポストという違反行為をしてしまいました。
パソコン初心者が注意書きも読まずに、勝手な事をして皆さんに迷惑をかけてしまい、
深く反省しています。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

解決したらしいので'オマケ' : full_add を追加。

#include <utility>
#include <iostream>
#include <iomanip>

typedef std::pair<bool,bool> result_type;

inline bool logical_xor(bool x, bool y) { return x != y; }
inline bool logical_and(bool x, bool y) { return x && y; }
inline bool logical_or(bool x, bool y) { return x || y; }

inline result_type half_add(bool x, bool y) {
return result_type(logical_xor(x,y), logical_and(x,y));
}

result_type full_add(bool x, bool y, bool carry) {
result_type result1 = half_add(x, y);
result_type result2 = half_add(result1.first, carry);
return result_type(result2.first, logical_or(result1.second,result2.second));
}

// ----------------------------------------

void half_evaluate(bool a, bool b) {
std::cout << std::boolalpha;
result_type result = half_add(a, b);
std::cout << std::setw(5) << a << +
<< std::setw(5) << b << =
<< std::setw(5) << result.first << (carry =
<< std::setw(5) << result.second << )
<< std::endl;
}

void full_evaluate(bool a, bool b, bool c) {
std::cout << std::boolalpha;
result_type result = full_add(a, b, c);
std::cout << std::setw(5) << a << +
<< std::setw(5) << b << +
<< std::setw(5) << c << =
<< std::setw(5) << result.first << (carry =
<< std::setw(5) << result.second << )
<< std::endl;
}

int main() {
std::cout << half adder: << std::endl;
half_evaluate(false, false);
half_evaluate( true, false);
half_evaluate(false, true);
half_evaluate( true, true);

std::cout << std::endl << full adder: << std::endl;
full_evaluate(false, false, false);
full_evaluate( true, false, false);
full_evaluate(false, true, false);
full_evaluate( true, true, false);
full_evaluate(false, false, true);
full_evaluate( true, false, true);
full_evaluate(false, true, true);
full_evaluate( true, true, true);

return 0;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました