ページ 11

D3DCOLOR_ARGBマクロの作り方について

Posted: 2013年2月01日(金) 02:43
by bonbo
早速ですが質問させていただきます。
タイトルの通りですが、D3DCOLOR_ARGBマクロを作るにはどうしたらよいのでしょうか。

一応同様の働きをするマクロを作ることを考え以下のようなコードを無理矢理組んだのですが

コード:

#define D3DCOLOR_ARGB(da,dr,dg,db) (da*100*100*100+dr*100*100+dg*100+db)
この方法では3桁×3が限界でした。
(極力環境に依存しないように)3桁の数字を4つ保存するためにはどうすればよいのでしょうか。

アバウトな質問で申し訳ないのですが
よろしくお願いします。

Re: D3DCOLOR_ARGBマクロの作り方について

Posted: 2013年2月01日(金) 05:19
by 木霊
3年ぶりぐらいにプログラムしてるので間違いがあったらごめんなさい

ちなみにcodeタグからC++と決め付けての回答です
3桁の数値が0~255までなら8ビットで表せますから、ビット演算を使えば8ビット*4=32ビットなので
環境次第ですが収まります(例ではunsigned long型)

こっちがマクロ

コード:

#define D3DCOLOR_ARGB(da,dr,dg,db) ( (da<<24) +(dr<<16) +(dg<<8) +db )
使う時はこんな感じで

コード:

unsigned long sample = D3DCOLOR_ARGB ( 100, 200, 100, 50 );
unsigned int Test_da = (sample &0xff000000)>>24;
unsigned int Test_dr = (sample &0x00ff0000)>>16;
unsigned int Test_dg = (sample &0x0000ff00)>> 8;
unsigned int Test_db =  sample &0x000000ff;
個人的にはマクロより関数にする方が好き

コード:

const unsigned long D3DCOLOR_ARGB ( unsigned int da, unsigned int dr, unsigned int dg, unsigned int db )
{
// 各要素について255超は255に補正する
	return ( (da<<24) +(dr<<16) +(dg<<8) +db );
};
ただ、この場合は素直に構造体やクラスを使うのが一番環境依存が低いのかもしれません(正確な事は言語仕様に詳しい方待ちですが)
この場合コンストラクタを定義すれば初期化漏れを防げますし、メンバ関数次第で不正な値が代入されるのを防いだり、
4つの値を自作関数に渡したい時に引数を一つで済ませられる利点があります
オフトピック
もっと時間が取れるようになったらメンバー登録したいんですけどね・・・
当分はROMで我慢、我慢
次に顔を出せたとしてもこの時間帯ですorz

Re: D3DCOLOR_ARGBマクロの作り方について

Posted: 2013年2月01日(金) 12:26
by bonbo
>木霊さん
ありがとうございます。
>C++
はい。書いていませんでした。すみません。
実はビット演算について曖昧なのですが
255を16進数表記にすれば2桁*4で
unsigned long int(D3DCOLOR型)の10桁内に収まるということでいいのでしょうか。

マクロなんだからコードにそのまま乗っていましたね…またおろかな質問をしてしまいました…

ありがとうございました。

Re: D3DCOLOR_ARGBマクロの作り方について

Posted: 2013年2月01日(金) 12:37
by softya(ソフト屋)
unsigned long intが10桁とは10進数での話でしょうか?
4294967295が最大値ですので、10桁といえば10桁ですが。

2進数の理解は深い部分をやるには必須だと思います。
コンピュータの中は基本2進数で動いていますので。

Re: D3DCOLOR_ARGBマクロの作り方について

Posted: 2013年2月01日(金) 12:54
by bonbo
>softyaさん
ありがとうございます。
どこかでしっかりやらなければまずいですね…
ビット演算子の所をやり直してきます。

Re: D3DCOLOR_ARGBマクロの作り方について

Posted: 2013年2月01日(金) 13:01
by softya(ソフト屋)
bonbo さんが書きました:>softyaさん
ありがとうございます。
どこかでしっかりやらなければまずいですね…
ビット演算子の所をやり直してきます。
こういうRGBなどのデータは2/16進数で処理する前提のデータ形式です。
それを10進数で話そうとするとかえってややこしくなるので、普通は行いません。

10進数で255とかでも16進数なら0xffで2進数なら1111111と8bitの2進数の話になり桁の収まりも納得の形になります。
C言語ならprintfで%x書式で16進数の表示もできますので活用して下さい。

2進数と16進数の相互変換は単純なので覚えてもらったほうが良いでしょう。
「2進数、16進数」
http://www.n-study.com/network/binhex.htm

Re: D3DCOLOR_ARGBマクロの作り方について

Posted: 2013年2月01日(金) 18:06
by ISLe
2進数とか16進数というのは表現方法の違いだけなので、ビット演算と直接の関係はありません。
コンピュータの内部は2進数なので、2進数や16進数で考えたほうが収まりが良いというのはありますが。

例えば、12時間制で午後6時は、24時間制では18時です。
分で表すと1080分ですが、午後6時を1080分というひとはいないでしょう。
60分を1時間に換算(60進法)したほうが分かりやすいからです。


((da << 24)+(dr << 16)+(dg << 8)+db)

((da * 256 * 256 * 256)+(dr * 256 * 256)+(dg * 256)+db)

((da * 0x1000000)+(dr * 0x10000)+(dg * 0x100)+db)
は同じ意味です。
桁数という点ではいちばん下のほうが分かりやすい面もあるかもしれません。