早速ですが質問させていただきます。
タイトルの通りですが、D3DCOLOR_ARGBマクロを作るにはどうしたらよいのでしょうか。
一応同様の働きをするマクロを作ることを考え以下のようなコードを無理矢理組んだのですが
この方法では3桁×3が限界でした。
(極力環境に依存しないように)3桁の数字を4つ保存するためにはどうすればよいのでしょうか。
アバウトな質問で申し訳ないのですが
よろしくお願いします。
D3DCOLOR_ARGBマクロの作り方について
-
木霊
Re: D3DCOLOR_ARGBマクロの作り方について
3年ぶりぐらいにプログラムしてるので間違いがあったらごめんなさい
ちなみにcodeタグからC++と決め付けての回答です
3桁の数値が0~255までなら8ビットで表せますから、ビット演算を使えば8ビット*4=32ビットなので
環境次第ですが収まります(例ではunsigned long型)
こっちがマクロ 使う時はこんな感じで
個人的にはマクロより関数にする方が好き
ただ、この場合は素直に構造体やクラスを使うのが一番環境依存が低いのかもしれません(正確な事は言語仕様に詳しい方待ちですが)
この場合コンストラクタを定義すれば初期化漏れを防げますし、メンバ関数次第で不正な値が代入されるのを防いだり、
4つの値を自作関数に渡したい時に引数を一つで済ませられる利点があります
ちなみにcodeタグからC++と決め付けての回答です
3桁の数値が0~255までなら8ビットで表せますから、ビット演算を使えば8ビット*4=32ビットなので
環境次第ですが収まります(例ではunsigned long型)
こっちがマクロ 使う時はこんな感じで
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
当分はROMで我慢、我慢
次に顔を出せたとしてもこの時間帯ですorz
-
bonbo
Re: D3DCOLOR_ARGBマクロの作り方について
>木霊さん
ありがとうございます。
>C++
はい。書いていませんでした。すみません。
実はビット演算について曖昧なのですが
255を16進数表記にすれば2桁*4で
unsigned long int(D3DCOLOR型)の10桁内に収まるということでいいのでしょうか。
マクロなんだからコードにそのまま乗っていましたね…またおろかな質問をしてしまいました…
ありがとうございました。
ありがとうございます。
>C++
はい。書いていませんでした。すみません。
実はビット演算について曖昧なのですが
255を16進数表記にすれば2桁*4で
unsigned long int(D3DCOLOR型)の10桁内に収まるということでいいのでしょうか。
マクロなんだからコードにそのまま乗っていましたね…またおろかな質問をしてしまいました…
ありがとうございました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: D3DCOLOR_ARGBマクロの作り方について
unsigned long intが10桁とは10進数での話でしょうか?
4294967295が最大値ですので、10桁といえば10桁ですが。
2進数の理解は深い部分をやるには必須だと思います。
コンピュータの中は基本2進数で動いていますので。
4294967295が最大値ですので、10桁といえば10桁ですが。
2進数の理解は深い部分をやるには必須だと思います。
コンピュータの中は基本2進数で動いていますので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
bonbo
Re: D3DCOLOR_ARGBマクロの作り方について
>softyaさん
ありがとうございます。
どこかでしっかりやらなければまずいですね…
ビット演算子の所をやり直してきます。
ありがとうございます。
どこかでしっかりやらなければまずいですね…
ビット演算子の所をやり直してきます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: D3DCOLOR_ARGBマクロの作り方について
こういうRGBなどのデータは2/16進数で処理する前提のデータ形式です。bonbo さんが書きました:>softyaさん
ありがとうございます。
どこかでしっかりやらなければまずいですね…
ビット演算子の所をやり直してきます。
それを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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: D3DCOLOR_ARGBマクロの作り方について
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)
は同じ意味です。
桁数という点ではいちばん下のほうが分かりやすい面もあるかもしれません。
コンピュータの内部は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)
は同じ意味です。
桁数という点ではいちばん下のほうが分かりやすい面もあるかもしれません。