• ベストアンサー

rgb値を16進数に変換

r,g,b値がそれぞれ10進数で与えられ、それらをそれぞれ16進数に変換します。このとき、例えばrの値が10進数でnだとすると、 (16進数の2桁目)=n/16 (16進数の1桁目)=n mod 16 になると思いました。 しかし、手元にある、人からもらったサンプルでは、 (16進数の2桁目)=(n mod 256)/16 となっていました。1桁目は私の考えと同じでした。 なぜn mod 256が入っているのか分かる方、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>(16進数の2桁目)=(n mod 256)/16 n >= 256 でも正しい値を返すより頑健な(汎用的な)コードです。 0 <= n <= 255 がチェックされているならどちらでも 同じです。

bcbcbc
質問者

お礼

>0 <= n <= 255 がチェックされているなら そのサンプルプログラムはチェックされていなかったので、modが入っていたのですね。 理解できました。 回答ありがとうございました。

その他の回答 (1)

  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.1

エラーデータ(256以上の値)が入ってくるかもしれない事を考慮したのでしょう。

bcbcbc
質問者

お礼

回答ありがとうございました。 納得です。

関連するQ&A

  • ラベルをRGBに変換する方法

    k=1,2...,n-1,n の値をRGBに変換したいんです。 k=1をR=50,G=89,B=32 という風に。(数字はランダムです) RGBはすべて0~255の範囲です。 近いkのRGBとは離れた色にしたいんです。 画像関係のことなんですが、処理は数学なので投稿しました。 お願いします。

  • n進数の値を10進数の値に変換するには?

    こんにちは。 C言語において、n進数の値を10進数の値に変換する方法を考えています。 例えば、2進数の101を、10進数で表すと5になります。 これを関数化し、 n_to_m(int x, unsigned n); といったプロトタイプで、 渡された整数x(n進数)を、10進数での値に変換する関数を作りたいのです。 逆に、10進数の値を、n進数の値に変換する関数も一緒に作りたいと考えています。 何かいい方法を思いついた方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

  • 34進数への変換など

    別の質問で4桁の数字を以下の方法で34進数からor34進数へ変換する式を見付けました。 これを9ケタの数字の変換に拡張しようとするとどういうのがいいのでしょうか? 2倍チョットの分量の式にしなくてはいけませんでしょうか? いいやり方を教えてください。 A1に値を入れて、 34進→10進 =(SEARCH(LEFT(A1,1),"0123456789ABCDEFGHJKLMNPQRSTUVWXYZ")-1)*34^3+(SEARCH(MID(A1,2,1),"0123456789ABCDEFGHJKLMNPQRSTUVWXYZ")-1)*34^2+(SEARCH(MID(A1,3,1),"0123456789ABCDEFGHJKLMNPQRSTUVWXYZ")-1)*34+(SEARCH(RIGHT(A1,1),"0123456789ABCDEFGHJKLMNPQRSTUVWXYZ")-1) 10進→34進 =MID("0123456789ABCDEFGHJKLMNPQRSTUVWXYZ",INT(A1/34^3)+1,1)&MID("0123456789ABCDEFGHJKLMNPQRSTUVWXYZ",INT(MOD(A1,34^3)/34^2)+1,1)&MID("0123456789ABCDEFGHJKLMNPQRSTUVWXYZ",INT(MOD(A1,34^2)/34)+1,1)&MID("0123456789ABCDEFGHJKLMNPQRSTUVWXYZ",MOD(A1,34)+1,1)

  • 16進数で表現される色をRGB値になおす計算

    例えば、「#F30485」という色を出したいとき、RGB値になおす場合計算方法は、 「0~9」の値はそのままで、「A~F」は「A=10」「B=11」「C=12」「D=13」「E=14」「F=15」として、2桁ずつそれぞれR・G・Bの値なので、R値は「15*16+3=243」、G値は「0*16+4=4」、B値は「8*16+5=133」で、「rgb(243,4,133)」。 つまり、計算式は、 「それぞれの最初の桁の数字*16+それぞれの2番目の桁の数字」 ということで合っているでしょうか? 回答よろしくお願いします。

    • ベストアンサー
    • HTML
  • 2進数&10進数&16進数の変換

     ◆ コンピュータで使用される2進数  人が日常使用している数値は10進数ですが、コンピュータは内部で数値を表現する場合、2進数を使用  しています。しかし、「0」と「1」だけの2進数では人が分かりにくいため、人間が見えるところでは  コンピュータは2進数を10進数や16進数が変換して表現しています。ここではその変換方法を学びます。  ◆ 2進数  2進数とは、「0」と「1」の2種類の数字を用いて全ての数を表現します。10進数では0から数えて「9」の  次は位があがることになりますが、2進数では「 1 」の次に位があります。位があがれば、その新しい桁は   「 1 」 となり、それ以下の桁は全て 「 0 」 となります。それでは、2進数の数の増え方を見てみましょう。      ところで、2進数を表現する時は一般的に8桁単位で表現するため、8桁未満の場合は頭に0をつけます。  つまり、上の2進数の値は順番に 00000000 → 00000001 → 00000010 → 00000011 → 00000100 →  00000101 → 00000110 → 00000111 → 00001000 と表します。以下は2進数と10進数の対応表です。 2進数と10進数の対応表 10進数 0 1 2 3 4 5 6 7 8 9 10 ・・・ 2進数 0 1 10 11 100 101 110 111 1000 1001 1010 ・・・  ◆ 2進数から10進数への変換方法  10進数と2進数の対応表は以下の通りです。2進数の桁が上がる時の10進数の値が以下となります。 2進数と10進数の対応表2 10進数 1 2 4 8 16 32 64 128 2進数 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000  従って、2進数で「1」となっている桁に対応する上記の10進数の基準値を合計することにより、2進数から  10進数の値を求めることができます。例えば、2進数の「 00101010 」を10進数に変換する場合、基準値が  32、8、2の所でビットが1なので下図の通り、2進数の「 00101010 」は10進数では「42」だと分かります。            ◆ 10進数から2進数への変換方法  10進数の数値を「 0 」になるまで「 2 」で割り算していき、その結果の「余りの数 」を並べることで  ある10進数の値を2進数の値へ変換することができます。それでは、具体的に変換して見て行きましょう。           例えば、10進数の「160」を2で割り算していくと上図の結果となります。後は、余りの数を下から順番に  並べれば 「 10100000 」 の値が算出されます。次に、「22」を2で割り算していき余りの数を下から順に  並べれば 「 10110 」 の値が算出されます。ネットワークにおいては、2進数を一般的に8桁で表示する  ことから、8桁になるよう上位に「 0 」を追加して「 00010110 」とします。当然「 10110 」と同じ値。 因みにここ参照ですがhttp://www.infraexpert.com/study/ip1.html なぜこれが10進数なんでょうか? 10進数というのは、0から9までの数字が1増えて10になるんですよね? なのに2進数と10進数の対応表2を見ると 倍数になっているのですが、、 これはいったいどういう違いなんでしょうか? 回答お願いいたします。 ほかにも解らなそうな点は、教えて頂けると幸いです。

  • 数学の問題 場合の数と漸化式

    数学の問題 数字1,2,3をn個並べてできるn桁の数全体を考える。そのうち1が奇数回現れるものの個数をa(n)、1が偶数回現れるか全く現れないものの個数をb(n)とする。 a(n+1)、b(n+1)をa(n)、b(n)を用いて表せ。 という問題です。 説明された考え方 a(n+1)について 1が奇数回現れている数の一番左に1桁の数を加えるとすると 1が奇数回でないといけないから2か3である。 よって、2a(n) 1が偶数回現れている数の一番左に1桁の数を加えるとすると 1が偶数回でないといけないから1である。 よって、b(n) 以上より、a(n+1)=2a(n)+b(n) 同様にして、b(n+1)=a(n)+2b(n) が答えです。 解説を聞く前に自分で考えたその考え方は同じでした。 n桁の数に1桁の数を加えるというやり方です。 しかし、計算が違いました。 説明では、「一番左に1桁加える」として計算していますが 最初、n桁の数の場合、その数と数の間はn+1あるから そのn+1の間から一か所選んで、そこに2か3を入れる、そしてそれがa(n)個あるから a(n+1)=(n+1)C1 * 2 * a(n) + (n+1)C1 * 1 *b(n) を計算しました。 何がいけないのでしょうか? 一番左に加えると決めつけてしまってもいいのでしょうか? お願いします。

  • お願いします、教えてください。10進数を2進数に変換するには・・・。

    10進数を2進数に変換するプログラムを作成したのですが、うまく動作しません、どうしても解らないので教えてください。 サンプルコードを元に「define」は5で稼動出来る様にしたいのですが、動作せず困っています。以下の、どの部分を修正すれば変換出来るのでしょうか? ご教授よろしくお願いいたします。 //10進数文字を数字の2進数で表示 #include "stdafx.h" #define HEX 5 //「function」:入力文字された文字の処理///////////////////////////////////// char ToInt( char cInt) { int mal=0; switch (cInt){ case '0': mal=0; break; case '1': mal=1; break; case '2': mal=2; break; case '3': mal=3; break; case '4': mal=4; break; case '5': mal=5; break; case '6': mal=6; break; case '7': mal=7; break; case '8': mal=8; break; case '9': mal=9; break; } return (mal); } //「function」:入力文字された文字数//////////////////////////////////////////// char HexInt( char eInt) { char mul=0; switch (eInt){ case 0: mul='0'; break; case 1: mul='1'; break; } return (mul); } //「function」:桁数の計算(10×指数を計算)/////////////////////////////////// int HexAcc( int n ) { int i; int ans=1; for( i=0; i<n; i++ ){ ans *= 10; } return (ans); } int _tmain(int argc, _TCHAR* argv[]) { int i=0,n=0,j=0,s=0,k=0,m=0,e=0,ans=0, add=0; char decimal[255], ditto[255],sub[255],temp[255],chg[255],siu[255]; //入力されない場合// if( 1 > argc ){ } else{ printf("10進数を入力してください。\n"); return 1; } for( k=0; k<255; k++ ){ //文字として'0'を代入// sub[k] = '0'; //subに文字として'0'を代入// temp[k] = '0'; //tempに文字として'0'を代入// chg[k] = '0'; //chgに文字として'0'を代入// siu[k] = '0'; //siuに文字として'0'を代入// } //入力された文字数を受取る// for( i=0; argv[1][i] != '\0'; i++ ){ decimal[i] = argv[1][i]; } decimal[i] = '\0'; //空白文字のチェック// for( i=0; decimal[i] != '\0'; i++ ){ if( decimal[i] != ' ' ){ ditto[n] = decimal[i]; n++; } } //'\0'を代入(文字列の終端)// ditto[n]='\0'; //「0」から「9」のループ// for( n=0; ditto[n] != '\0'; n++ ){ if(( ditto[n] == '0' ) || ( ditto[n] == '1' ) || ( ditto[n] == '2' ) || ( ditto[n] == '3' ) || ( ditto[n] == '4' ) || ( ditto[n] == '5' ) || ( ditto[n] == '6' ) || ( ditto[n] == '7' ) || ( ditto[n] == '8' ) || ( ditto[n] == '9' )){ }else{ printf("エラー\n 10進数を入力してください。\n"); return 0; } } //桁数のループ// for( n=0; ditto[n] != '\0'; n++ ){ m = m + 1 ; } //桁数の判断// if( m <= HEX ){ }else{ printf("エラー\n入力文字数は、%d文字以内にしてください。\n",HEX); return 0; } //subにdittoを代入// for( n=0; ditto[n] != '\0'; n++){ sub[HEX-m+n] = ditto[n]; } sub[HEX] = '\0'; //'\0'を代入(文字列の終端)// //sub[0]からsub[9]の計算// for( n=0; sub[n] != '\0'; n++){ ans = ToInt(sub[n]); add += ans * HexAcc(HEX-n-1); } //2進数の計算・商が0になるまで// for( n=0; sub[n] != '\0'; n++ ){ temp[n] = add % 2; add = add / 2; if( add == 0){ break; } } temp[HEX] = '\0'; //'\0'を代入(文字列の終端)// //桁数のチェック(商・余り)// for( ; n>=0; n-- ){ e = e++; } //temp・値の入替え「tempからchg」// for( n=0; sub[n] != '\0'; n++ ){ chg[HEX-n-2] = temp[n]; } chg[HEX]='\0'; //'\0'を代入(文字列の終端)// //2進数に変換// for( ; n>=0; n-- ){ siu[n] = HexInt(chg[n]); } siu[HEX]='\0'; //'\0'を代入(文字列の終端)// printf("\n10進数文字を2進数で変換した値は・・・ %s \n",siu); }

  • ユークリッドの互除法で最大公約数を求める

    <問題> n^2+2n+1とn+3の最大公約数になりうる値をすべて求めよ <解答> 整数a,bに対してa,bの最大公約数をg(a,b)とあらわす。 g(n^2+2n+1,n+3)=g(n+3,4) 4の正の約数は1,2,4であるから、g(n+3,4)として考えうるのも1,2,4である。 例えば、 n+3=5 すなわちn=2のとき、g(5,4)=1 n+3=6 ・・・ g(6,4)=2 n+3=8 ・・・ g(8,4)=4 となり、最大公約数として可能な数は1,2,4の3つの自然数である。 <質問> 「g(n+3,4)として考えうるのも1,2,4である。」 が必要条件であることはわかります。 その後、解答でなにがしたいのかよくわかりません。 なぜ例示しただけで「最大公約数として可能な数は1,2,4の3つの自然数である。」といえるのでしょうか? よろしくお願いします。 <思ったこと> 必要十分条件なら「g(n+3,4)として考えうるのも1,2,4である」場合、「4の正の約数は1,2,4である」であることを示すことになると思います。

  • 10進数の2進数文字列変換

    10進数の2進数文字列変換 ◆開発環境 OS:Linux(Ubuntu9.10) コンパイラ:gcc4.4 言語:C ◆質問内容 ポインタ*Aに格納されている10進数を2進数の文字列に変換し、 文字配列Bに格納したい。 バッファとして*fpを準備。 webで調査した結果を以下のソースのようにアレンジしましたが、 fputc関数の処理で、プログラムが強制終了してしまいます。 何か、良い方法ございませんでしょうか。 ◆サンプルソース void Dec_conv_bit(long *A,char *B){ unsigned int bit,n; //ビット比較用 unsigned int *fp = &n; n = (unsigned int)A; for(bit = 1 << sizeof(int)*8-1; bit > 0; bit >>= 1){ fputc((n & bit)?'1':'0',fp); } sprintf(B,"%s",fp); //putchar('\n'); }

  • RGBを三刺激値に変換(?)

    3CCDカメラで各R,G,Bごとに画像を出力してRの画像、Gの画像、Bの画像、 を取得しました。 そこで、画素の濃度のMaxが255で、各画像の同じ座標の 画素が例えばRの画像:100、Gの画像:200、Bの画像:50、だったとします。この値を、三刺激値のXYZで表現するにはどうしたら良いでしょうか。