2025-01-08
0と1の二進法の論理演算で動いているのがコンピューター。すべての演算は、ANDとORとNOTがあれば表現できます。演算子3つ、これがミニマムでしょうか?

実は、ORしてNOTする、NOR(ノア)や、ANDしてNOTするNAND(ナンド)という演算子1つあれば、AND、OR、NOTもつくることができるので、演算子は実は1つで十分!


「Nor」

名前のかわいさを優先して新プログラミング言語「Nor(ノア)」を「Wirth(ヴィルト)」をベースに開発しました。


「Nor Playground」

演算子として使えるのは論理和(or)を否定する(not)する、"nor"のみ。0か1の1bit同士の演算なので、パターンは4つしかありません。

まずは not を作ります。

function not(a) return a nor a end print not(0) # → 1 print not(1) # → 0

notができたら、norをnotすればorに!

function or(a, b) return not(a nor b) end

演算する前のaとbをnotすれば、andに!(ド・モルガンの法則

function and(a, b) return not(a) nor not(b) end

ANDとORとNOTができたので、1bitの足し算、半加算器を作ります。


「Wikipedia 加算機 における半加算器の図に、注釈追加」

AとBの足し算の計算結果Sと、繰り上がり(キャリー)CのAND/OR/NOTによる組み立て例です。

function halfadd(a, b) c = and(a, b) s = and(or(a, b), not(c)) return [c, s] end

複数bitの足し算をするためには、下の桁からの繰り上がりをサポートした全加算器を作ります(参考、加算機 - Wikipedia

function fulladd(a, b, x) cs1 = halfadd(a, b) cs2 = halfadd(cs1[1], x) c = or(cs1[0], cs2[0]) s = cs2[1] return [c, s] end

全加算器を使って、4bitの足し算をしてみます

function add(a, b) x = 0 s = [0, 0, 0, 0] for i = 3 to 0 step -1 cs = fulladd(a[i], b[i], x) x = cs[0] s[i] = cs[1] next return s end a = [0, 1, 0, 0] # 4 b = [0, 1, 0, 1] # 5 print add(a, b) # → [1, 0, 0, 1] 9

配列を使って2進法4bitの数を表現しています。


「Nor - Playground」

Norの実行環境で実際に試してみてください!

links
- Pascalリスペクトの教育用構造化プログラミング言語「Wirth」

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS