C 論理演算 新しいページはコチラ
提供: yonewiki
(→論理演算) |
(→論理演算) |
||
145行: | 145行: | ||
+ | プログラムのサンプルは以下のとおりです。2進数に変換する処理が標準関数では準備されていないので、テンプレート関数を使って変換出力する関数を作ってみました。誰がやっても大体同じような変換処理になると思います。なるべくわかりやすいように冗長なプログラムになっていますが、テンプレート関数が分からないと、変換関数もイマイチわからないと思います。テンプレート関数については別途記載したいとおもいますので、ここではビット単位の論理演算について理解してもらえればよいと思います。 | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #include <iostream> | ||
+ | template<class T> | ||
+ | void printBit(T bit){ | ||
+ | int nBitCnt; | ||
+ | int nBitScan; | ||
+ | char* pcharBitArr; | ||
+ | printf("("); | ||
+ | nBitCnt = sizeof(bit) * CHAR_BIT; | ||
+ | pcharBitArr = new char[nBitCnt]; | ||
+ | nBitScan = 0; | ||
+ | while(nBitScan <= nBitCnt){ | ||
+ | pcharBitArr[nBitScan] = bit & 1; | ||
+ | bit = bit >> 1; | ||
+ | nBitScan++; | ||
+ | } | ||
+ | nBitScan = nBitCnt; | ||
+ | while(nBitScan > 0){ | ||
+ | if(nBitScan % 4 == 0 && nBitScan != nBitCnt){ | ||
+ | printf(" "); | ||
+ | } | ||
+ | printf("%d",pcharBitArr[nBitScan - 1]); | ||
+ | nBitScan--; | ||
+ | } | ||
+ | printf(")B"); | ||
+ | |||
+ | |||
+ | |||
+ | } | ||
+ | int main(){ | ||
+ | unsigned lBitA = 0xFFFFFF00; | ||
+ | unsigned int nBitB = 0xFF54; | ||
+ | |||
+ | int nBitC = -65535; | ||
+ | |||
+ | printf("A\n"); | ||
+ | printf("0x%08X %014d:\n",lBitA,lBitA); | ||
+ | printBit(lBitA); | ||
+ | printf("\n"); | ||
+ | printf("\n"); | ||
+ | |||
+ | printf("B\n"); | ||
+ | printf("0x%08X %014d:\n",nBitB,nBitB); | ||
+ | printBit(nBitB); | ||
+ | printf("\n"); | ||
+ | printf("\n"); | ||
+ | |||
+ | printf("C\n"); | ||
+ | printf("0x%08X %014d:\n",nBitC,nBitC); | ||
+ | printBit(nBitC); | ||
+ | printf("\n"); | ||
+ | printf("\n"); | ||
+ | |||
+ | printf("ビット単位論理積\n"); | ||
+ | printf("A & B\n"); | ||
+ | printBit(lBitA); | ||
+ | printf(" and\n"); | ||
+ | printBit(nBitB); | ||
+ | printf("\n"); | ||
+ | printf("---------------------------------------------\n"); | ||
+ | printBit(lBitA & nBitB); | ||
+ | printf("\n"); | ||
+ | printf("\n"); | ||
+ | |||
+ | printf("ビット単位論理和\n"); | ||
+ | printf("A | B\n"); | ||
+ | printBit(lBitA); | ||
+ | printf(" or\n"); | ||
+ | printBit(nBitB); | ||
+ | printf("\n"); | ||
+ | printf("---------------------------------------------\n"); | ||
+ | printBit(lBitA | nBitB); | ||
+ | printf("\n"); | ||
+ | printf("\n"); | ||
+ | |||
+ | printf("ビット単位排他的論理和\n"); | ||
+ | printf("A ^ B\n"); | ||
+ | printBit(lBitA); | ||
+ | printf(" exor\n"); | ||
+ | printBit(nBitB); | ||
+ | printf("\n"); | ||
+ | printf("---------------------------------------------\n"); | ||
+ | printBit(lBitA ^ nBitB); | ||
+ | printf("\n"); | ||
+ | printf("\n"); | ||
+ | |||
+ | printf("ビット単位論理否定\n"); | ||
+ | printf("~B\n"); | ||
+ | printBit(nBitB); | ||
+ | printf(" not\n"); | ||
+ | printf("---------------------------------------------\n"); | ||
+ | printBit(~nBitB); | ||
+ | printf("\n"); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | そして、処理結果はこのようになります。 | ||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
A | A | ||
185行: | 284行: | ||
(1111 1111 1111 1111 0000 0000 1010 1011)B | (1111 1111 1111 1111 0000 0000 1010 1011)B | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | このように整数型intやlongで宣言された変数に代入した値は、2進数表記のような機械語で格納されていて、論理演算のビット毎論理演算では、結果表示のような演算がされます。10進数や16進数だけで演算結果を見ているとわけのわからない数字に変化する演算ですが、ビット単位でみるとすごく簡単な演算がなされてるのがわかると思います。対応するビット同士で論理積や論理和、排他論理和、論理否定を計算しているだけです。 | ||
+ | |||
+ | |||
+ | 排他論理和はここではじめて登場する演算ですが、異なる数字同士のビット値ならば、1(真=true)とする変わった演算です。excrusive or とも表現されるためEX ORやEOR,XORと表現されます。XORが標準的な表現になると思います。 | ||
+ | |||
if文における判定処理も論理演算の1(真=true)と0(偽=false)に基づいて実施されていますので、論理演算は重要な知識となります。よく理解しておきましょう。できれば一歩踏み込んだブール代数論やディジタル回路工学まで理解できると良いのですが、理解しようとすれば、時間がいくらあってもたりません。排他的論理和やAならばBといった集合論くらいは抑えておきたいものです。AND回路/OR回路/NAND回路/NOR回路/EXOR回路/**フリップフロップ回路/こういった仕組みを理解することによってコンピュータのクロックと演算処理装置と制御装置と入出力装置の仕組みが理解できるようになります。情報工学や情報技術系の勉強を体系的に理解する学問では学習する機会の多い学問分野になります。トランジスタや半導体のスイッチやメモリの仕組みについても理解していける学問です。半導体を理解するには、更に電子物性論といったものや力学や電磁気学や化学そしてさらには自然工学、光学、量子化学、量子力学、量子物理学を理解していくことになります。実際の製造ではもちろん統計学が必要になりますし、画像処理工学や技術者倫理学、各種機器の取り扱い資格に文献を理解する語学力も必要になってきます。コンピュータを構成する機器を理解するには医学とはまた異なる専門性がそこにはあるのかもしれません。コンピュータを軸にバイオミメティクスや医学、宇宙工学が展開しているとすれば情報工学の理解は基礎の基礎くらいなのかもしれないですね。もちろん知らなくても現代の専門家程度であれば継続的な研究は可能だと思いますが、これからの専門性は計算機に頼る部分も多大になっていくものではないかと思います。 | if文における判定処理も論理演算の1(真=true)と0(偽=false)に基づいて実施されていますので、論理演算は重要な知識となります。よく理解しておきましょう。できれば一歩踏み込んだブール代数論やディジタル回路工学まで理解できると良いのですが、理解しようとすれば、時間がいくらあってもたりません。排他的論理和やAならばBといった集合論くらいは抑えておきたいものです。AND回路/OR回路/NAND回路/NOR回路/EXOR回路/**フリップフロップ回路/こういった仕組みを理解することによってコンピュータのクロックと演算処理装置と制御装置と入出力装置の仕組みが理解できるようになります。情報工学や情報技術系の勉強を体系的に理解する学問では学習する機会の多い学問分野になります。トランジスタや半導体のスイッチやメモリの仕組みについても理解していける学問です。半導体を理解するには、更に電子物性論といったものや力学や電磁気学や化学そしてさらには自然工学、光学、量子化学、量子力学、量子物理学を理解していくことになります。実際の製造ではもちろん統計学が必要になりますし、画像処理工学や技術者倫理学、各種機器の取り扱い資格に文献を理解する語学力も必要になってきます。コンピュータを構成する機器を理解するには医学とはまた異なる専門性がそこにはあるのかもしれません。コンピュータを軸にバイオミメティクスや医学、宇宙工学が展開しているとすれば情報工学の理解は基礎の基礎くらいなのかもしれないですね。もちろん知らなくても現代の専門家程度であれば継続的な研究は可能だと思いますが、これからの専門性は計算機に頼る部分も多大になっていくものではないかと思います。 |