- hoehoe1234
- 334
- 1
- 0
- 0
エンジョイC 21回目 2020/8/16(日) 今回は牛本のビット演算について講義を行いました。C言語では内部表現をそのまま利用することが多いのですがビット演算などはその最たるものですね。この3つ目のforが分からないということがあり、生徒さんどうしで検討していただきました。 pic.twitter.com/MGxsHzMpOr
2020-08-23 05:01:32直感的に何回ループするのか分かりくいですね。0x80はビットでいうと1000 0000 なので終了条件となるのはゼロなので8回ループします。題材にしているのは数字をどのようにしてビットに圧縮するか?みたいな演習問題です。
2020-08-23 05:03:16これは生徒さんがおいしいミスを提供してくれましたので了承の上でのUPです。どうしてもビットがクリアされない!と思っていたら謎の「;」がありました。この図はわかりやすいように改行していただいてます。 pic.twitter.com/TQIosBcAL6
2020-08-23 05:04:55仮想的なビットマップ端末(テキスト端末ですね)に対しての出力です。牛本の演習ではナナメ線を一本だけでしたがやはりXにしたほうがかっこいいですね。ちなみにこれは/の線が1つずれています。 pic.twitter.com/h6h25ZRYp2
2020-08-23 05:06:31その理由を解析して修正したXがこちらになります。このあたりはC言語に限らないのですが+1、-1の間違いがどうしても起きてしまいますね。C言語では配列ガードがないのでそのまま動いてしまうので理由がなかなかわからないことがありますね。 pic.twitter.com/kkj3EkgDdB
2020-08-23 05:08:11上の2つのfor文が線を引くコードです。この2つのコードはモデル化された(概念的なとでもういうのでしょうか?)「整数」で線を引きます。SET_BITはマクロで整数をビットの位置へのセットに変換します。CREA_BITマクロは逆にリセットします。 pic.twitter.com/HqGZmoQYk9
2020-08-23 05:10:09うまく線が引けていません。今回はSET_BITがマクロなので.iファイルをみてマクロがどのように展開されているのか確認します。マクロ引数のxとyを括弧で囲んでいなかったので演算子の優先順位でおかしくなっていますね。 pic.twitter.com/udearYjYEZ
2020-08-23 05:11:51ということでマクロの引き数を括弧で囲みます。インクルードファイルの展開を見たり、アセンブラコードをみることでより理解が深まると思います。 pic.twitter.com/11sET5mCgz
2020-08-23 05:13:14マクロの拡大です。一つ一つ紐解いていかないとなにをしているのかわかりにくいですね。牛本ではこのマクロを組む前にまず数式とロジックを組み立てています。 pic.twitter.com/dY47wG9i8W
2020-08-23 05:15:24今度はXの代わりに市松模様を書いてみてもらっています。このあいだTLでもありましたね。この生徒さんはXとYが両方偶数か、両方基数か。という判断をしています。こういうのはまずはボードに図を書くと共通のルールを見つけ出しやすいですね。 pic.twitter.com/t0uS3JxOig
2020-08-23 05:17:20私はTLでX+Yが偶数になればよい。というのを知っていましたが、前出の生徒さんは自分でパターンを見抜いて両方偶数、両方基数を導き出したので立派だと思います。ロジックが思い浮かばないときはまず図と具体例をかいてみることは重要ですね。 pic.twitter.com/nmJVdVeJ2H
2020-08-23 05:18:40今回は主に牛本を進めました。 エンジョイCコースもいつからでもどなたでも参加できます。ご興味のある方はお気軽にお問い合わせください。
2020-08-23 05:19:35