シフト演算について

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

シフト演算について

#1

投稿記事 by shun » 13年前

ある関数でカラーを管理するために特殊な引数を使っております。
今まで"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) );

box
記事: 2002
登録日時: 14年前

Re: シフト演算について

#2

投稿記事 by box » 13年前

回答しようとする側でその現象を正確に再現できる、
必要最小限のソースコード(main関数付き)を提示していただけないでしょうか。

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

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

Re: シフト演算について

#3

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

ぱっと目につくのが

コード:

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

shun

Re: シフト演算について

#4

投稿記事 by shun » 13年前

皆様、ご回答ありがとうございます。
できました!シフト演算が間違えておりました。
ソースは下記になります。

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

コード:

#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;

}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: シフト演算について

#5

投稿記事 by みけCAT » 13年前

解決でしたら、解決チェックをお願いします。
なぜ「今まで"0xffffffff"のようして2bitずつ設定していた」のに、いきなり8bitずつに増えているのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

紫電
記事: 14
登録日時: 13年前

Re: シフト演算について

#6

投稿記事 by 紫電 » 13年前

おお、参考になります。

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

Re: シフト演算について

#7

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

紫電さん。 他の人が解決チェックするのは混乱の元なので出来れば避けて下さい。
一応外しておきました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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