【24ビットカラー】に関する知恵袋
【質問】
#define LINE ((((WIDTH)*24+31)&~31)/8)のマクロについて動画のサンプルコードに#define LINE ((((WIDTH)*24+31)&~31)/8)というマクロが出てきます。印刷の方式を解説させていただくと、印刷の方式について話していくと、LINEは一行あたりのメモリの大きさ、WIDTHは画面の横幅です。①8ビットの大きさをもつ配列に格納しようとしているので「/8」になるのだと思います。②「*24」は24ビットカラーということだと思います。①、②の解釈は正しいのでしょうか?また、24のビットカラーの知恵袋を説明すると、「+31」と「&~31」はどういう意味なのか分からないので教えてください。回答よろしくお願いします。24のビットカラーの知恵袋について詳しく解説させていただいた。
【解答】
(1)(2)は概ねそういうことでしょうね。(1)について補足するならば、Cではメモリを扱う際のサイズの単位は「バイト:byte」です。システムの1byteが8bitだと決め打ちすれば、印刷の方式から考察していくと、24のビットカラーの知恵袋の考察をします。では、ビット数を8で割ればCで扱うメモリのサイズに換算できる、ということです。#もとのプログラムでは、1byte=8ビットとかフルカラー=24bitとか決め打ち/数値のべた書きをしていますけれど、出来れば#defineなどを使って意味を明確にしたほうがいいかも知れません。しなくても動きますけれど。+31, &~31については、24のビットカラーの知恵袋の説明をすると、32進数で考えるとわかりやすい(なんじゃそりゃ)のですが、切り上げの処理です。32bit単位で変数を扱うのが現在の32/64bitのシステムでは効率がいいので、切り上げして(コンピュータ的に)キリをよくしたいということですね。最近のシステムならメモリはたくさん載ってますから、多少のメモリの無駄は問題じゃありません。さて。切り上げの処理ですが...まずは10進数で考えてみましょう。ある正の整数xを一の位で切り上げしようとするとき、プログラムに書くとしたらどうします?よくあるパターンが(x+9)/10*10です。xの一の位が0以外なら9を足すことによって繰り上がりが発生します。これを10で割って10をかけると、印刷の方式についてです。また、整数演算ですから一の位が切り捨てになるので結果として一の位での切り上げになるわけです。やることは二つ。・一の位に値があれば十の位を一つ増やす・その後、一の位を切り捨てる質問の式に話を戻せば、+31は10進の+9に相当する処理。一の位に値があれば「32の位?」を1増やします。これはいいですね。&~31は、32進数で考えると一の位の切り捨て処理になります。二進数とビット演算がわかっていないとちょっと難しく思えるかも知れませんが...二進数と32進数は相性がよく(2^5=32だから)、二進数の5桁区切りが32進数に対応します。そこで、2進数5桁の最大数31、そのビット反転~で論理積&をとってやれば32進数の下一桁がクリアされる(=切り捨て)ことになります。十進数で考えれば、□□□0というマスクを作って数字にかぶせてやるような処理です。