5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

We need NAND

1 :デフォルトの名無しさん:2006/05/20(土) 18:29:17
NANDがあれば何でも出来る

2 :デフォルトの名無しさん:2006/05/20(土) 18:33:34
NAND AT !?

3 :デフォルトの名無しさん:2006/05/20(土) 18:49:08
なんだ

4 :デフォルトの名無しさん:2006/05/20(土) 19:03:15
&~

5 :デフォルトの名無しさん:2006/05/20(土) 19:33:39
ハードの話かよ

6 :デフォルトの名無しさん:2006/05/20(土) 20:23:08
演算NANDとクロック信号与える関数だけつかってプログラム組んでみる?

7 :デフォルトの名無しさん:2006/05/20(土) 20:24:46
NOT
CNOT
CCNOT
XCHG

8 :デフォルトの名無しさん:2006/05/20(土) 20:32:42
ニートにあればなんでもできる!

9 :デフォルトの名無しさん:2006/05/21(日) 00:17:50
Nanですか?

10 :デフォルトの名無しさん:2006/05/21(日) 01:19:42
74HC00があればなんでもできる!

11 :デフォルトの名無しさん:2006/05/21(日) 01:28:11
donna nand?

12 :デフォルトの名無しさん:2006/05/21(日) 11:51:23
not A = A nand A
A and B = (A nand B) nand (A nand B)
A or B = (A nand B) nand (B nand B)

13 :デフォルトの名無しさん:2006/05/21(日) 11:53:23
↑最後違った
A or B = (A nand A) nand (B nand B)

14 :デフォルトの名無しさん:2006/05/21(日) 14:25:35
> A and B = (A nand B) nand (A nand B)

頭悪すぎ。

A and B = (A nand B) nand 1

15 :デフォルトの名無しさん:2006/05/22(月) 01:03:02
板違いのような気がする

16 :デフォルトの名無しさん:2006/05/22(月) 02:54:31
>>15
nand Aとー

17 :デフォルトの名無しさん:2006/05/22(月) 13:50:50
NANDaかなー

18 :デフォルトの名無しさん:2006/05/22(月) 17:25:53
nand eもないようなことがー 幸せだったとおもーうー

19 :デフォルトの名無しさん:2006/05/22(月) 20:04:50
ハードを知らずにソフトは語れNAND

20 :デフォルトの名無しさん:2006/05/22(月) 20:13:18
NANDだけではダメだ。シフト命令と条件分岐が必要だ

論理演算だけの加算
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;


21 :デフォルトの名無しさん:2006/05/22(月) 20:14:00
割算
function 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;

22 :デフォルトの名無しさん:2006/05/22(月) 20:14:55
掛算
function 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;

23 :デフォルトの名無しさん:2006/05/22(月) 20:48:55
>>20
シフト? いらないよ。
全ての変数を1ビット値の配列として表現すればいいだけの話だ。

条件分岐は、うーん、どうしようかな。
フリップフロップ機能を持つ関数を使ってもいいということにしないと難しいな。

24 :デフォルトの名無しさん:2006/05/22(月) 21:33:38
コンパイル時にきちんとコードを展開してやれば分岐はいらな(ry

25 :デフォルトの名無しさん:2006/05/22(月) 21:57:56
がんばってシフトも分岐もないnandだけの加算をやってみるか。

26 :デフォルトの名無しさん:2006/05/22(月) 22:45:59
加算って普通シフトも分岐もないと思うが…。

27 :デフォルトの名無しさん:2006/05/22(月) 23:39:52
C++で出来たよー

inline 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));
}

28 :デフォルトの名無しさん: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;
}


こんな感じで、論理回路モドキになってます。
改良すればもっと大規模な回路も再現できるはず… 実用性は定かでないが

29 :デフォルトの名無しさん:2006/05/23(火) 00:29:30
どうせなら「i<STEP」や「i++」も・・・いや、NANDeもない。

30 :デフォルトの名無しさん:2006/05/23(火) 00:38:35
>>29
そこはforループを使わないようにすればおけ

31 :デフォルトの名無しさん:2006/05/23(火) 06:07:18
>>23
その場合、アドレス変数はどうするの?
 >>20の加算減算は条件分岐無しでビット数だけループすればいいけど
 割算は厄介だねえ


32 :デフォルトの名無しさん:2006/05/28(日) 01:11:35
マネーの虎に出てたラーメン屋の名前か

33 :デフォルトの名無しさん:2006/07/19(水) 17:06:33
x86にもPPCにもNAND命令がないのはなんでだぜ?

7 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)