みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

構造体の部分で " | " の記述の意味が解りません

初心者でネットや本で探したのですが
探し方が良くないのか見つかりませんでした。

構造体の部分で " | " の記述の意味が解りません
以下なのですが...

よろしくお願いします。

AudioStreamBasicDescription aiffFormat;
aiffFormat.mSampleRate = 44100;
aiffFormat.mFormatID = kAudioFormatLinearPCM;
aiffFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger |
kLinearPCMFormatFlagIsPacked |
kLinearPCMFormatFlagIsBigEndian;
aiffFormat.mBytesPerPacket = 4;
aiffFormat.mFramesPerPacket = 1;
aiffFormat.mBytesPerFrame = 4;
aiffFormat.mChannelsPerFrame = 2;
aiffFormat.mBitsPerChannel = 16;

投稿日時 - 2004-07-04 13:55:42

QNo.914287

暇なときに回答ください

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

これはおそらく、
mFormatFlagsというメンバによって、
いくつかの設定情報を記録しているのです。

kLinearPCMFormatFlagIsSignedIntege
kLinearPCMFormatFlagIsPacked
kLinearPCMFormatFlagIsBigEndian
などは、ヘッダファイルのどこかで定数として宣言されており、
その値は2進数で
0000001
0000010
0000100
という感じの値になっていると思います。
(ある特定のケタだけが1になっている)

これを|(ビット和演算子)で組み合わせると、
00000111
という数字になります。
これをフラグとして記憶しておきます。

あとでこのフラグを見ると、
「2進数として見て、1ビット目が1だから、
kLinearPCMFormatFlagIsSignedIntegeになっているのだな。
(データがsigned integerとして表されていることを示している?)」
ということがわかります。
IsPackedとかIsBigEndianも同様に、2進数としてのnケタ目を見て、条件がどうなっているか調べます。
イエスかノーかの情報には本来1ビットしか必要ないので、
そのためにint型の変数(メンバ)をひとつ使ってはちょっともったいないわけです。
メモリを節約するためによく使われる方法です。

投稿日時 - 2004-07-04 14:16:50

お礼

詳しい説明、ありがとうございます。
理解できました。

投稿日時 - 2004-07-04 19:27:54

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

 「|」演算子は「ビットごとの論理和」です。ここでは,モード指定に使われています。
 ですから,たとえば,記号定数 A が 0x01,B が 0x02,C が 0x04,D が 0x08 としましょう。
 このとき,A | C は 0x05 となって,下から 1 ビットめと 3 ビットめが 1 になります。同様に,B | C | D は 0x0E となります。
 お示しのコードでは,それぞれの記号定数に上述のような値が割り当てられていて,その組み合わせでモードを指定し,構造体のメンバに代入しています。

投稿日時 - 2004-07-04 14:16:41

お礼

ありがとうございます。
理解できました。

投稿日時 - 2004-07-04 19:25:21

あなたにオススメの質問