C 論理演算のソースを表示
新しいページはコチラ
移動:
案内
,
検索
※このページではC言語にも存在していたという意味で記事タイトルがC ポインタになっていますが、<br /> [[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> <br /> == '''論理演算''' == 論理演算ってのは、普通の算数とは違う和と積の考え方をする分野の仕組みです。これは電子回路でつくられるON・OFFの考え方を数学的に表現しようとするためのモノだと思えばよいと思います。コンピュータも電子回路で構成されていますし、プログラムもメモリの中のON・OFFによって構成される記号の塊です。いわゆる機械語は電子回路のON・OFFによって表現されます。それが2進数であり、発展したものがニーモニック言語でありアセンブラ、16進数表記の考え方に発展し、それを構成するための高水準言語としてCやC++の言語が作られ、コンパイルやリンクの作業や翻訳・解析処理によって機械語を生成しているのです。 上記のような世界観を考えるために生まれた論理演算は論理積・論理和・論理否定・論理排他和を基本的な演算として論理シフト・論理算術シフトといった特殊な操作を含めた演算があります。これによって電気信号のON・OFFの計算結果を表現することで、通常の算数の演算表現や文字表現からマルチメディア(音・音楽・音声・映像・動画・アニメ・外部機器制御)、コンピュータ自身の制御までを網羅しようとする演算手法です。 論理演算は、上記のような幅広い役割に発展することもあり、非常に幅広い学問でもあるため、このWikiの項目では、その論理演算の全てを解説することはありません。ここではプログラムで表現される論理演算の基礎的な表現だけを解説します。その応用方法については、この広大なネットの情報や専門書の解説にゆずりたいと思います。論理演算で数学を表現できるのですが、その数学の表現と論理演算には、より簡素に表現する工夫がなされていたり、論理演算の表現の限界や論理演算独自の特徴を活かすことや、コンピュータの処理速度と論理演算の回数との関係による計算の可用性(うまく利用できる性質)の限界、限界を利用した暗号の仕組みがあるので、論理演算で全てを表現できるかが、コンピュータの可能性をひろめていると考えてよいと思います。わたくしなりの解説でしたが論理演算の世界の奥深さだけは肝に銘じていただけたなら幸いです。 それでは、プログラムで使われる論理演算の基礎的な部分について、実際に記載してみたいと思います。 まずは論理値同士の演算をする論理演算子についてですが、これは[[Cpp bool型|bool]]型同士の演算とも言えるかもしれません。論理値は1(真=true)もしくは0(偽=false)で表すもので、 論理和の演算子は '''||''' です。 {| style="color:black;" class="wikitable_ronriwa" border="1" cellspacing="0" |- ! 値1 !! 値2 !! 結果 |- | 0 || 0 || 0 |- | 0 || 1 || 1 |- | 1 || 0 || 1 |- | 1 || 1 || 1 |} 値1と値2のどちらかが1(真=true)になっていたら結果は1(真=true)になります。したがって、すべてが0(偽=false)のときだけ結果が0(偽=false)になります。値1 || 値2 || 値3 のようにまとめて記述しても良いです。値1と値2の計算結果と値3の論理和を計算するように処理が実行されます。カッコをつけて値1 || (値2 || 値3)のようにすると演算順序優先度はカッコの中が優先されます。これは一般的な算数(数学)の法則と似ているので覚えやすいでしょう。 論理積の演算子は '''&&''' です。 {| class="wikitable_ronriseki" border="1" cellspacing="0" |- ! 値1 !! 値2 !! 結果 |- | 0 || 0 || 0 |- | 0 || 1 || 0 |- | 1 || 0 || 0 |- | 1 || 1 || 1 |} 値1と値2の全てが1(真=true)になっていたら結果は1(真=true)になります。したがって、いずれかが0(偽=false)のときには結果が0(偽=false)になります。 このように論理和を日本語で表現する場合に「あるいは」とか「もしくは」とか「または」という言葉を当てはめることができ、論理積は「かつ」という言葉を当てはめることが多く、「値1 または 値2」や「値1 かつ 値2」のようにも表現します。 論理否定は一つの論理値の手前に '''!''' を値の前に記述します。 {| class="wikitable_ronriseki" border="1" cellspacing="0" |- ! 値1 !! 結果 |- | 0 || 1 |- | 1 || 0 |} 値1が0(偽=false)になっていたら結果は1(真=true)になります。逆に値1が1(真=true)になっていたら結果は0(偽)になります。 このように論理否定を日本語で表現する場合「の反対」とか「の否定」とか「の逆」という言葉をあてはめることが多く「値1の否定」のようにも表現します。 上記のような論理演算をプログラムで表現する場合には以下のようなものになります。 <syntaxhighlight lang="cpp" line start="1"> #include <iostream> int main(){ bool bTrue = true; bool bFalse = false; bool bResult = false; int nZero = 0; int nOne = 1; int nTwo = 2; int nResult; printf("論理和\n"); bResult = bFalse || bFalse; printf("%d = %d || %d\n",bResult, bFalse, bFalse); bResult = bFalse || bTrue; printf("%d = %d || %d\n",bResult, bFalse, bTrue); bResult = bTrue || bFalse; printf("%d = %d || %d\n",bResult, bTrue, bFalse); bResult = bTrue || bTrue; printf("%d = %d || %d\n",bResult, bTrue, bTrue); printf("\n"); printf("論理積\n"); bResult = bFalse && bFalse; printf("%d = %d && %d\n",bResult, bFalse, bFalse); bResult = bFalse && bTrue; printf("%d = %d && %d\n",bResult, bFalse, bTrue); bResult = bTrue && bFalse; printf("%d = %d && %d\n",bResult, bTrue, bFalse); bResult = bTrue && bTrue; printf("%d = %d && %d\n",bResult, bTrue, bTrue); printf("\n"); printf("論理否定\n"); bResult = !bFalse; printf("%d = !%d\n",bResult, bFalse); bResult = !bTrue; printf("%d = !%d\n",bResult, bTrue); printf("\n"); } </syntaxhighlight> というように記述します。 上記のプログラムの結果はこうなります。 <syntaxhighlight lang="text"> 論理和 0 = 0 || 0 1 = 0 || 1 1 = 1 || 0 1 = 1 || 1 論理積 0 = 0 && 0 0 = 0 && 1 0 = 1 && 0 1 = 1 && 1 論理否定 1 = !0 0 = !1 </syntaxhighlight> 値の部分はBool型のようなもの同士が理解しやすいですが、Bool型以外の値同士でも論理演算を行うことは可能です。一般の算数(数学)における0(Zero)という値だけが0(偽=false)として扱われるので、任意の型の変数の実体が0以外のなんらかの値を保有していれば1(真=true)であることになります。この部分はプログラミング言語の処理系によって異なることが多いので混同してしまう多言語プログラマは多いかもしれませんね。論理演算における比較演算子の動作および一般の算数(数学)表現における0(Zero)以外が1(真=true)となることについては[[Cpp bool型|bool]]の記事でも確認できます。 次にビット単位の論理演算について触れます。これは特定の型の値をビット表記(機械語)にしたもの同士の論理演算をまとめて実施するものです。ネットワーク通信や外部機器制御信号(USB通信/Bluetooth/MIDI/パラレル通信/PIC…etc)の取り出し処理によく使われる手法にもなります。 ビット単位論理和の演算子は '''|''' です。<br /> ビット単位論理積の演算子は '''&''' です。<br /> ビット単位論理否定演算子は '''^''' です。 if文における判定処理も論理演算の1(真=true)と0(偽=false)に基づいて実施されていますので、論理演算は重要な知識となります。よく理解しておきましょう。できれば一歩踏み込んだブール代数論やディジタル回路工学まで理解できると良いのですが、理解しようとすれば、時間がいくらあってもたりません。排他的論理和やAならばBといった集合論くらいは抑えておきたいものです。AND回路/OR回路/NAND回路/NOR回路/EXOR回路/**フリップフロップ回路/こういった仕組みを理解することによってコンピュータのクロックと演算処理装置と制御装置と入出力装置の仕組みが理解できるようになります。情報工学や情報技術系の勉強を体系的に理解する学問では学習する機会の多い学問分野になります。トランジスタや半導体のスイッチやメモリの仕組みについても理解していける学問です。半導体を理解するには、更に電子物性論といったものや力学や電磁気学や化学そしてさらには自然工学、光学、量子化学、量子力学、量子物理学を理解していくことになります。実際の製造ではもちろん統計学が必要になりますし、画像処理工学や技術者倫理学、各種機器の取り扱い資格に文献を理解する語学力も必要になってきます。コンピュータを構成する機器を理解するには医学とはまた異なる専門性がそこにはあるのかもしれません。コンピュータを軸にバイオミメティクスや医学、宇宙工学が展開しているとすれば情報工学の理解は基礎の基礎くらいなのかもしれないですね。もちろん知らなくても現代の専門家程度であれば継続的な研究は可能だと思いますが、これからの専門性は計算機に頼る部分も多大になっていくものではないかと思います。
C 論理演算
に戻る。
個人用ツール
3.16.31.119
このIPアドレスのトーク
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ