• ベストアンサー

VC++ (byte)(col & 0xFF) の意味

VC++で画像処理のプログラムを作成中です。 ビットマップを読み込み、1ピクセルごとに処理を施すのが目的です。 「デジタル画像処理入門」という本に col = GetPixel(hDC1,i,j); r = (byte)(col & 0xFF); g = (byte)(col/0x100 & 0xFF); b = (byte)(col/0x1000 & 0xFF); というプログラムが載っていました。 ここで、(byte)とはどういう意味なのでしょうか? また、(col & 0xFF)の意味はわかるのですが(col/0x100 & 0xFF)はどういう意味なのでしょうか? 例えば、colの値が0x300(10進数で258)だとすると、 col/0x100=258/256=1 となってしまうと思うのですが。 VC++のヘルプやgoogleで検索してみたのですが、わからなかったので、ここで質問させてもらいました。 お分かりの方、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#11722
noname#11722
回答No.4

まずGetPixelの戻り値がCOLORREF型です。 このCOLORREFはカラー値として使われる 32 ビット値なのですが、中に赤、青、緑の各値(0~255)を持っています。 例えば(ちょっと暗い水色)B=0xFF,G=0xA0,R=0x10であれば 0x00FFA010になります。 (col/0x100 & 0xFF)はそれぞれの色の成分を抽出するためで COL=0x00FFA010であれば、 (byte)(col & 0xFF) = 0x10 (byte)(col/0x100 & 0xFF) = 0xA0 (byte)(col/0x1000 & 0xFF) = 0xFF になります。 ちなみに (byte)(col/0x100 & 0xFF) = 0xA0 は col/0x100 時点で 演算結果は 0x0000FFA0 になり、 その後 0xFF でANDを取ることにより 0x000000A0 のみを抽出しています。 このままだと値自体はまだ32ビットなので、 byteによって1バイトにキャスト(型変換)しています。

string
質問者

お礼

ありがとうございます。大変よくわかりましたm(__)m。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • bonyamk
  • ベストアンサー率29% (49/166)
回答No.3

col = GetPixel(hDC1,i,j); r = (byte)(col & 0xFF); g = (byte)(col>>8 & 0xFF); b = (byte)(col>>16 & 0xFF); 普通、こういうふうにシフト演算子で書いたほうがすっきりするような・・・ ま、コンパイラが最適化してくれるんでしょうが^^;

string
質問者

お礼

ありがとうございます。自分でプログラムを書くときには使わせていただきます。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

C言語をよく知らないで、いきなり画像処理プログラムを書くというのが無理があります。 まずは、CまたはC++の入門書を読んで文法を一通り理解してからのほうが、急がば回れになると思います。 参考までに、(byte)は、型定義とか、キャストの項目に説明があるでしょう。 (col/0x100 & 0xFF)については、「(col & 0xFF)の意味はわかる」とお書きですが、これの意味がわからないということは、&演算子の意味がわかっていないか、もしくは、col/0x100が、col>>8と同じである事に気づいていないか。いずれにせよビット演算の項目をよく読みましょう。

string
質問者

お礼

ありがとうございます。キャストで引いたらわかりました。

すると、全ての回答が全文表示されます。
回答No.1

> colの値が0x300(10進数で258)だとすると、 > col/0x100=258/256=1となってしまうと思うのですが。 0x300は10進数で768です。

string
質問者

お礼

ありがとうございます。258は0x102でした。お恥ずかしい。 おかげさまでcol/0x100 & 0xFFの処理内容が理解できました。

すると、全ての回答が全文表示されます。

関連するQ&A