• ベストアンサー

24ビットの変数

はじめまして。 WinXP pro(SP2) VC6.0(SP6) MFC使用です。 とある理由から24bit(3byte)の整数型変数の型を 作っています(仮にINT24とします)。 その変数が満たさなければならない条件として (1)サイズが3バイトである(sizeof(INT24) == 3) (2)INT24 nInt24 = nValue(int型の変数)という形で使える (3)int nValue = nInt24(INT24型の変数)という形で使える というのがあります。 それで、構造体を使用して下のように 定義をしました。 typedef struct tagInt24 {   BYTE byData[3];   void operator = (int nValue)   {     byData[0] = (nValue & 0x0000FF);     byData[1] = ((nValue & 0x00FF00) >> 8);     byData[2] = ((nValue & 0xFF0000) >> 16);   }; }INT24, *LPINT24; これで(1)と(2)は満たせるのですが (3)をどうやって実現するのか悩んでおります。 どなたか知恵をお貸しいただけないでしょうか。

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

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

operator int() を定義しては?

FAY
質問者

お礼

ありがとうございました。 typedef struct tagInt24 {   BYTE byData[3];   void operator = (int nValue)   {     byData[0]  =  (nValue & 0x0000FF);     byData[1]  =  ((nValue & 0x00FF00) >> 8);     byData[2]  =  ((nValue & 0xFF0000) >> 16);   };   operator int()   {     return (byData[0] + (byData[1] << 8) + (byData[2] << 16));   }; }INT24, *LPINT24; とすることで実現できました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「サイズが 24ビットでなければならない」という理由がよくわかりませんが, operator int() を定義しておけばいいはず.

FAY
質問者

お礼

ありがとうございました。 episteme さんのお礼の所に書いた とおりにすることで実現できました。 >「サイズが 24ビットでなければならない」という理由がよくわかりませんが #24ビットでなければならないってわけでは ないのですが24ビットのビットマップ画像の ビクセル配列を編修するときにあるとちょっと 便利なんです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • byte変数の大小を効率よく比較したい

    2つのbyte変数の比較を行いたいのですが、 byte aaa = 0x00; byte bbb = (byte)0xff; if(aaa > bbb){ 処理 } のようにするとbyteの最上位bitは符号として扱われるため 0xff=-127となってしまい意図した結果が得られません。 unsigned byteなるものがあれば都合がよいのですが、javaではサポートしておらず困っております。 代替案として、 if(aaa&0xff > bbb&0xff) などとして、一度intへ変換後比較すれば可能ですが、int用のメモリ領域を作成しなくてはならず、非効率の気がします。 byte変数の比較で、他に効率のよい方法はりませんでしょうか?

    • ベストアンサー
    • Java
  • map::find()の戻り値が変数に入ってくれません。

    こんにちは、boundaryといいます。 ユーザー型のキーとユーザー型の値をmapに挿入したのです が、map::find()の戻り値が変数に入ってくれません。 operator=を定義しないといけないのかなと思いやってみた のですがうまくいきません。 std::map<ユーザー型,ユーザー型>::iteratorを定義しない といけないのでしょうか? どなたかお知恵をお貸しください。 よろしくおねがいします。 windows2000 vc6.0sp5 ps.ソースコードを載せようとしたのですが、質問文字数が 最長文字数を超えるようで質問する事ができません。 ですのでかなり端折っています。(スミマセン) /* mapのキーです。 */ typedef struct _StateAndReturn { int State; int Return; } StateAndReturn; /* mapの値です。 */ struct NextStateAndFunc { NextStateAndFunc& operator=(const NextStateAndFunc& X){ NextState = X.NextState; MemFuncPointer = X.MemFuncPointer; } typedef int (Funcs::*pFunc)(); int NextState; pFunc MemFuncPointer; }; class CEventMap { private: typedef int (Funcs::*pFunc)(); typedef map<StateAndReturn, NextStateAndFunc, my_less> _EventFuncMap; _EventFuncMap EventFuncMap; public: void Set(int StateNow, int ServerReturnCode, int StateNext, pFunc pF) { /*登録します。*/ } const NextStateAndFunc Answer(int StateNow, int ServerReturnCode) { StateAndReturn tempStateAndReturn; tempStateAndReturn.State = StateNow; tempStateAndReturn.Return = ServerReturnCode; map<StateAndReturn, NextStateAndFunc>::const_iterator ite; ite = EventFuncMap.find(tempStateAndReturn); /* ←ここでエラーになります。 */ return ite->second; } };

  • byte[2] から int へ。

    それぞれintの下位2バイトのビット列保持するbyte型配列の要素2つを int 形の整数に治したいのですがいい方法が思いつきません。例えば、 byte[0] = 0x01; byte[1] = 0x01; ならば、 00000000 00000000 00000001 00000001 で、256 + 1 = 257 byte[0] = 0x02; byte[1] = 0x10; ならば、 00000000 00000000 00000010 0000011 で、512+3 = 515 です。byteの値が0~127の場合は int n = byte[0] << 8 n = n | byte[1] という感じでいけそうなのですが、byte[0]が 0xFF のような負の値のときにint とのビット演算(もしくはシフト演算)で上位2バイト分も補数表記のためか全部1で埋まってしまい、上の方法はだめみたいです。 byte[0] = 0x01; byte[1] = 0xFF; のときは、 00000000 00000000 00000001 11111111 で、256+255 = 511 としたいのですが、場合わけをせずに求める よい方法はないでしょうか。

    • ベストアンサー
    • Java
  • sizeofの処理

    お世話になります sizeof()の処理について教えてください typedef struct {   BYTE m_bDat;   WORD m_wWord; }tTEMP; sizeof( tTEMP ); この場合、アライメントは最小としたとして、サイズは3と帰ってくるとします。 アライメントをコンパイルオプション等を使用して、2として再度sizeofを行います この際、値は4となると思います 知りたいのは、sizeofの処理方法です よろしくお願い致します

  • 構造体のメンバーの静的なサイズ取得

    構造体のメンバーをヘッダーファイル中で得たい場合、 以下のような方法以外になにか方法はないでしょうか? 単純に XXXX x;と宣言してそれを sizeof(x.chwk)と 使うというような方法以外で なにかあれば教えてください。 ---------------------------------------- typedef struct { char chwk[100]; } XXXX; typedef struct { char chwk[ sizeof(( (XXXX*)0)->chwk ) ]; } YYYY; main(int arc, char *arg[] ){ YYYY y; printf( " YYYY chwk size = %d\n", sizeof(y.chwk)); }

  • プログラム終了時にエラーが発生する

    現在作成中のプログラムは終了する時にアクセス違反が発生しましたと 表示されます。 以前はこの様なことはなかったのですが構造体に変数を追加した直後に起こるようになりました。 typedef struct _A{ int x,y; int cost; vector<int> To; vector<int> E_cost; }A_t; typedef struct _B{ double x,y; int sex; char Name[20]; vector<int> root; vector<A_t> Map; //このMapという変数を追加するとエラーがでる。 }B_t; この変数を消すとエラーが出ることはありません。 まだこの変数は追加しただけで使っていません。終了時にのみ発生します。

  • 長さ3のバイト配列

    長さ3のバイト配列 0~16777215の範囲の数値がありまして byte[ ] byteArrayA =BitConverter.GetBytes(0x00); byte[ ] byteArrayB =BitConverter.GetBytes(0xffffff); で、 00-00-00 FF-FF-FF と、長さ3固定のバイト配列を返して欲しい場合はどうすればいいのでしょう? そのまんまだとINT16かINT32かで配列の個数が違ってきますよね。 INT32型でだと4個の配列になっちゃいますが、3個でいいんです。 どうしましょう?

  • 変数の扱える範囲

    C言語で、整数型変数の扱える範囲を確認するために 以下のような処理をしているのですが、どうもうまくいきません。 変数に入りうる最大値の値を、2進数の計算ではなく プログラム内で正しく扱われているか確認する方法はないでしょうか? ご存知の方、教えてください<(_ _)> 宜しくお願いいたします。 **********************************************  unsigned long long I; unsigned long A; unsigned int B; unsigned short C; printf("I:%d A:%d byte B:%d byte C:%d byte \n"    ,sizeof(I),sizeof(A),sizeof(B),sizeof(C)); A = B = C = 0; for(I = 0; I <= 4294967295; I++){ A++;B++;C++; if(I>= 4294967290 && I<= 4294967295)    printf("I:%d A:%d B:%d C:%d\n",I,A,B,C); }

  • ビット演算について

    以下のプログラムを作成して、int型、char型、long型のAND演算・OR演算の結果の違いを見ました。 実行結果からchar型だけ結果の表示の仕方が他と異なっています。 一般的に、バイト数では、 char(1バイト) < short(2バイト) < int(4バイト) のはずなのに、出力結果は、 char(0xffffffff) > short(0xff) = int(0xff) となっていて、charが一番大きく?、shortとintが同じ結果? のようにみえてしまいよくわかりません。 私は、ビット演算が苦手なので、根本的に考え方が間違っているのかも しれませんが、どうしてこのような出力結果となるのか教えてください。 プログラム #include <stdio.h> #include <stdlib.h> int main() { int xi = 0x7F, yi=0x80; int stri1 = xi&yi; int stri2 = xi|yi; printf("** int **\n"); printf("%p\n",stri1); printf("%p\n\n",stri2); char xc = 0x7F, yc=0x80; char strc1 = xc&yc; char strc2 = xc|yc; printf("** char **\n"); printf("%p\n",strc1); printf("%p\n\n",strc2); short xl = 0x7F, yl=0x80; short strl1 = xl&yl; short strl2 = xl|yl; printf("** short **\n"); printf("%p\n",strl1); printf("%p\n\n",strl2); return(0); } 出力結果 ** int ** 0x0 0xff ** char ** 0x0 0xffffffff ** short ** 0x0 0xff

  • 構造体型のポインタ変数を含む構造体

    struct seiseki_tag { Int32 math ; Int32 english ; Int32 science; } ; typedef struct seiseki_tag SEISEKI ; struct personal_tag { Char name ; Int32 num ; SEISEKI *sptr } : typedef struct personal_tag PERSONAL ; struct info_tag { PERSONAL person_info ; } ; typedef struct info_tag INFO ; たとえば、上記のように3つの構造体があり、PERSONAL構造体のメンバーに SEISEKI構造体の型を持つポインタ変数が含まれているような場合で、下記のように INFO型のポインタ変数からSEISEKI構造体のメンバーを参照する方法を教えてください。 PERSONAL構造体メンバーのnameやnumは INFO *info ; info->person_info.name ; info->person_info.num ; のように参照すると思いますが、sptrが示すSEISEKI構造体のメンバーへの アクセスができません。下記のように参照を試みたのですがコンパイルは 通るのですが、実際に参照できていませんでした。 INFO *info ; SEISEKI *seiseki ; seiseki = info->person_info.sptr ; seiseki->math ; 判りにくい説明で申し訳ありませんが、どなたか教えていただければと思います。 よろしくお願いいたします。

筆王のアプリから印刷できない
このQ&Aのポイント
  • 筆王のアプリから印刷できない
  • 筆王のアプリから印刷できない
  • 昨年は、悩むことなくできました。
回答を見る