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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bonbo

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

#1

投稿記事 by bonbo » 13年前

早速ですが質問させていただきます。
タイトルの通りですが、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マクロの作り方について

#2

投稿記事 by 木霊 » 13年前

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

bonbo

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

#3

投稿記事 by bonbo » 13年前

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 13年前

unsigned long intが10桁とは10進数での話でしょうか?
4294967295が最大値ですので、10桁といえば10桁ですが。

2進数の理解は深い部分をやるには必須だと思います。
コンピュータの中は基本2進数で動いていますので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

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

#5

投稿記事 by bonbo » 13年前

>softyaさん
ありがとうございます。
どこかでしっかりやらなければまずいですね…
ビット演算子の所をやり直してきます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 13年前

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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#7

投稿記事 by ISLe » 13年前

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)
は同じ意味です。
桁数という点ではいちばん下のほうが分かりやすい面もあるかもしれません。

閉鎖

“C言語何でも質問掲示板” へ戻る