執筆者:mznh今回は構造体とbit演算を行います。ポインタを乗り越えた皆さんからすれば今回の内容はおまけみたいなものです。構造体は複雑なプログラムを記述するには必要不可欠ですしbit演算はマイコンプログラミングには無くてはならない存在です。構造体これまでに配列という同じ型のデータを番号をつけてまとめたものを学びました。配列を使えば出席番号を添え字にしてその人の成績を管理するといった処理が簡単に書けます。いった場合はどうでしょうか。math[生徒数]というように教科ごとに配列を宣言しておくことを考えた方、素晴らしい、どちらも正解です。成績だけではなく生徒の名前や身長や体重なども合わせて記録しておきたい生徒の名前はchar型の配列もしくはポインタ、身長や体重は実数なのでfloatやdouble型です。型が違うので多次元配列では表現できません。ように宣言すればこれは対応できるのですが、これはこれで困ったことがあります。生徒のデータとは別に教師のデータも保持しておきたいとします。教師にも名前や身長があります。そこでそれぞれ配列を宣言してみると//仮に生徒数を100、教員数を10としておきます。//教師のデータちょっと見づらいですね。体重や視力、住所などが増えたらどんどん見づらくなってしまいます。生徒のデータは生徒のデータだけでまとめて管理したいですね。そこで今回学ぶ構造体というものが必要になってきます。構造体というのは複数の変数をひとまとめにした変数です。成績をひとまとめにしたいですね。それらをまとめた生徒(student)という構造体を作ってあげて、そのstudent構造体を配列で宣言してあげれば良いわけです。以下にそのイメージを示しましょう。student構造体は以下のような構造体です。studentstudentsの中にはnameやheightといった変数が内包されています。あとはこのstudent構造体という大きな箱を配列で宣言してあげれば良いです。構造体のイメージ、つかむことができたでしょうか?では実際に構造体の宣言や使い方を学んでいきましょう。構造体の宣言は今までの普通の変数やポインタとはちょっと違います。いうのもいきなり使える構造体を宣言、というわけにはいかないのです。最初にほしい構造体の設計図を宣言してあげる必要があります。いう単語(この単語の名前が調べても出てこない)を使います。先ほどの例のとおりにstudentという名前の構造体の型を宣言してみましょう。あとは普通の変数のように宣言できます。student型のyamada_tarouという変数が宣言されます。一般化すると以下のようになります。:};メンバへのアクセス(ドット演算子)さて、構造体の変数を宣言したあとはその各要素に値を代入してみましょう。構造体の各要素のことをメンバと呼びます。メンバにアクセスするにはドット演算子を用います。先ほどの例によりjapaneseに値を入れるには以下のようにします。;これを一般化すると以下のようになります。普通の変数と同様に構造体にもポインタがあります。宣言の仕方などは普通の変数と同じです。student型のポインタが宣言されます。してできた構造体のポインタを通してメンバにアクセスする場合「->」アロー演算子を使います。変数名;としてきました。typedefマクロtypedefマクロとは変数の型に新たな名前をつけるマクロです。int型にbignumという名前を付けたいときは以下のようにします。bignum;後は普通の型と同じように宣言できます。構造体名;と宣言して、変数の宣言を以下に簡略化できます。変数名;bit演算C言語講習最後の題目はbit演算です。マイコンプログラミングにおいては一番大事な題目かもしれませんのでしっかりと取得してください。bit演算子は変数を値ではなくてbit単位で計算します。2進数の知識が必要になりますがこの講習資料の中では説明しません。各自調べておいてください。bit演算子bit演算子にはAND,OR,NOT,XORの4種類があります。^で表し、以下のような演算をビットごとに行います。BINARY「離散数学の解説」(http://it-passport.sophia-it.com/content/テクノロジ系/基礎論理/基礎論理/離散数学)より引用シフト演算子シフト演算子はbit単位で値をずらします。わかりにくいので具体例を示しましょう。10という値があったとしますこれは8bitの2進数で0b00001010ですのでこれを左に1ずらすと0b00010100になります。このずらされたものを右に2ずらすと0b00000101となります。これを行うのが「>>」「<<」シフト演算子です。それぞれ右、左にシフトする演算子です。hoge<<3;とします。(hoge>>3がシフトされた値を返しています。:1で宣言した構造体の配列を宣言して中に適宜値を代入せよ。:int型の変数a,bにそれぞれ10と20を代入した後にaとbでANDを取ったものの値を出力せよ(いくつになるか考えてから出力するとよい)おまけもう少し複雑なプログラムが書けるようになりたい人は以下のAOJの問題をやってみてはどうでしょうか。ライセンスの下に提供されています。