ページ 11

シフト演算について

Posted: 2012年5月09日(水) 20:10
by shun
ある関数でカラーを管理するために特殊な引数を使っております。
今まで"0xffffffff"のようして2bitずつ設定していたのですが
ARGBマクロを使ってもっとわかりやすく記載したいと考えております。

わかりにくくて申し訳ございません。
ソースを書いてみたのですがうまく値が取得できていないようです。
取得時には全て0が入ってしまいます。
おそらくシフト演算が間違っているのですが、お分かりになる方おりませんでしょうか。

コード:

#define	ARGB(a,r,g,b)	(((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))

ARGB(255,255,255,255) → 0xffffffff // 

void test(unsigned long argb){
	int a = (((argb)&0xff)>>24); //上位1,2番目
	int r = (((argb)&0xff)>>16); //上位3,4番目
	int g = (((argb)&0xff)>>8); //上位5,6番目
	int b = ((argb)&0xff);//上位7,8番目
}

test( ARGB(255,255,255,255) );

Re: シフト演算について

Posted: 2012年5月09日(水) 20:15
by box
回答しようとする側でその現象を正確に再現できる、
必要最小限のソースコード(main関数付き)を提示していただけないでしょうか。

先ほど提示されたコードは一部分ですので、回答しようとする側が
勝手にmain関数などを書いた結果、質問者さんのお手元にあるはずのコードと
食い違ってしまうおそれがあるためです。

Re: シフト演算について

Posted: 2012年5月09日(水) 20:27
by softya(ソフト屋)
ぱっと目につくのが

コード:

void test(unsigned long argb){
    int a = (((argb)&0xff)>>24); //上位1,2番目
    int r = (((argb)&0xff)>>16); //上位3,4番目
    int g = (((argb)&0xff)>>8); //上位5,6番目
    int b = ((argb)&0xff);//上位7,8番目
}
先に&0xffで下位の8bitだけにしてしまっているので、シフトするとかならず0になると思います。
bだけは大丈夫です。

Re: シフト演算について

Posted: 2012年5月09日(水) 20:47
by shun
皆様、ご回答ありがとうございます。
できました!シフト演算が間違えておりました。
ソースは下記になります。

こんな簡単なことで質問してしまって申し訳ございません・・・。

コード:

#include <stdio.h>

#define ARGB(a,r,g,b)   (((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
 
// 検証用に追加
int test( unsigned long argb ){
    int a = ((argb>>24)&0xff); //上位1,2番目
    int r = ((argb>>16)&0xff); //上位3,4番目
    int g = ((argb>>8)&0xff); //上位5,6番目
    int b = ((argb)&0xff);//上位7,8番目

	return r;
}
 
int main() {
	
  printf( "%ld", test( ARGB(100,125,135,145) ) );
  printf( "\n" );
  return 0;

}

Re: シフト演算について

Posted: 2012年5月09日(水) 21:41
by みけCAT
解決でしたら、解決チェックをお願いします。
なぜ「今まで"0xffffffff"のようして2bitずつ設定していた」のに、いきなり8bitずつに増えているのですか?

Re: シフト演算について

Posted: 2012年5月10日(木) 03:32
by 紫電
おお、参考になります。

Re: シフト演算について

Posted: 2012年5月10日(木) 09:56
by softya(ソフト屋)
紫電さん。 他の人が解決チェックするのは混乱の元なので出来れば避けて下さい。
一応外しておきました。