We need NAND
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/05/20(土) 18:29:170002デフォルトの名無しさん
2006/05/20(土) 18:33:340003デフォルトの名無しさん
2006/05/20(土) 18:49:080004デフォルトの名無しさん
2006/05/20(土) 19:03:150005デフォルトの名無しさん
2006/05/20(土) 19:33:390006デフォルトの名無しさん
2006/05/20(土) 20:23:080007デフォルトの名無しさん
2006/05/20(土) 20:24:46CNOT
CCNOT
XCHG
0008デフォルトの名無しさん
2006/05/20(土) 20:32:420009デフォルトの名無しさん
2006/05/21(日) 00:17:500010デフォルトの名無しさん
2006/05/21(日) 01:19:420011デフォルトの名無しさん
2006/05/21(日) 01:28:110012デフォルトの名無しさん
2006/05/21(日) 11:51:23A and B = (A nand B) nand (A nand B)
A or B = (A nand B) nand (B nand B)
0013デフォルトの名無しさん
2006/05/21(日) 11:53:23A or B = (A nand A) nand (B nand B)
0014デフォルトの名無しさん
2006/05/21(日) 14:25:35頭悪すぎ。
A and B = (A nand B) nand 1
0015デフォルトの名無しさん
2006/05/22(月) 01:03:020016デフォルトの名無しさん
2006/05/22(月) 02:54:31nand Aとー
0017デフォルトの名無しさん
2006/05/22(月) 13:50:500018デフォルトの名無しさん
2006/05/22(月) 17:25:530019デフォルトの名無しさん
2006/05/22(月) 20:04:500020デフォルトの名無しさん
2006/05/22(月) 20:13:18論理演算だけの加算
function add(a,b:Integer):Integer;
var c:Integer;
begin
repeat
c:=(a and b);
a:=a xor b;
b:=c shl 1;
until b=0;
Result:=a;
end;
減算
function sub(a,b:Integer):Integer;//a-b
var c:Integer;
begin
repeat
c:=((not a) and b);
a:=a xor b;
b:=c shl 1;
until b=0;
Result:=a;
end;
0021デフォルトの名無しさん
2006/05/22(月) 20:14:00function unsigned_div(x,y:dword;var modu:dword):dword;
var a,b,c,v,w,lpc:dword;
begin
a:=0;
b:=0;
lpc:=1;
repeat
a:=a shl 1;
if (x and $80000000)<>0 then a := a or 1;
x := x shl 1;
b := b shl 1;
w:=y;
v:=a;
repeat
c:=((not v) and w);
v:=v xor w;
w:=c shl 1;
until w=0;
if (c and $80000000)=0 then begin
b:= b or 1;
a:= v;
end;
lpc:=lpc shl 1;
until lpc=0;
if @modu<>nil then modu:=a;
result:=b;
end;
0022デフォルトの名無しさん
2006/05/22(月) 20:14:55function unsigned_mpy(a,b:Cardinal):Cardinal;
begin
result:=0;
while b<>0 do begin
if (b and 1)<>0 then result:=add(result,a);
a:=a shl 1;
b:=b shr 1;
end;
end;
0023デフォルトの名無しさん
2006/05/22(月) 20:48:55シフト? いらないよ。
全ての変数を1ビット値の配列として表現すればいいだけの話だ。
条件分岐は、うーん、どうしようかな。
フリップフロップ機能を持つ関数を使ってもいいということにしないと難しいな。
0024デフォルトの名無しさん
2006/05/22(月) 21:33:380025デフォルトの名無しさん
2006/05/22(月) 21:57:560026デフォルトの名無しさん
2006/05/22(月) 22:45:590027デフォルトの名無しさん
2006/05/22(月) 23:39:52inline bool Nand(bool L, bool R) {return !(L&&R);}
inline bool Not(bool N){return Nand(N,N);}
inline bool And(bool L, bool R){return Nand(Nand(L,R),true);}
inline bool Or(bool L, bool R){return Nand(Nand(L,L),Nand(R,R));}
inline bool Xor(bool L, bool R){return And(Or(L,R),Nand(L,R));}
class Add_A_B{
const bool* A;
const bool* B;
bool* R;
int t; // calculate実行回数
void calculate();
bool sum(bool L, bool R){return Nand(Nand(L,Nand(L,R)),Nand(R,Nand(L,R)));}
public:
Add_A_B(const bool* dataA, const bool* dataB, bool* Result):A(dataA), B(dataB), R(Result), t(0){};
bool operator< (int obj) const{return t < obj;} // 実行回数を < 演算子で比較できる
int operator++ (int){calculate(); A++; B++; R++; return t++;} // 後置インクリメントのみ
};
void Add_A_B::calculate(){
static bool Carry = false;
*R = sum(sum(*A,*B),Carry);
Carry = Or(And(*A,*B),And(sum(*A,*B),Carry));
}
0028デフォルトの名無しさん
2006/05/22(月) 23:40:54#include <iostream>
int main(){
// ===== 初期化 ===== //
const int STEP =10; // 処理を行うステップ数
bool dataA[]={0,1,1,1,0,0,0,0,0,0}; // A=14
bool dataB[]={0,0,1,0,0,0,0,0,0,0}; // B=4
bool Result[STEP];
// これら配列長はSTEP以上であればいくらでもよい
// ===== A+Bを行う ===== //
for( Add_A_B i(dataA,dataB,Result); i<STEP; i++); // 必要なのは、これだけ!
// break無しのforループなので、書き下せば分岐命令一切無しのコードにできる。
// ===== 演算結果の表示 ===== //
for(int i=0; i<STEP; i++) std::cout << Result[i]; // A+Bの結果が格納されていることを確認
// 0100100000 と表示されればOK
return 0;
}
こんな感じで、論理回路モドキになってます。
改良すればもっと大規模な回路も再現できるはず… 実用性は定かでないが
0029デフォルトの名無しさん
2006/05/23(火) 00:29:300030デフォルトの名無しさん
2006/05/23(火) 00:38:35そこはforループを使わないようにすればおけ
0031デフォルトの名無しさん
2006/05/23(火) 06:07:18その場合、アドレス変数はどうするの?
>>20の加算減算は条件分岐無しでビット数だけループすればいいけど
割算は厄介だねえ
0032デフォルトの名無しさん
2006/05/28(日) 01:11:350033デフォルトの名無しさん
2006/07/19(水) 17:06:33■ このスレッドは過去ログ倉庫に格納されています