0

私の質問は主に typedef 列挙型をどのように解釈するかについてですが、背景は次のとおりです。

私は MailCore2 を使用しており、フェッチしている個々の電子メール オブジェクトからフラグを読み取る方法を見つけようとしています。

私が取得した各 MCOIMAPMessage * メールには、「フラグ」と呼ばれるプロパティがあります。フラグは MCOMessageFlag 型です。MCOMessageFlag の定義を調べると、それが typedef 列挙型であることがわかります。

typedef enum {
    MCOMessageFlagNone          = 0,
    /** Seen/Read flag.*/
    MCOMessageFlagSeen          = 1 << 0,
    /** Replied/Answered flag.*/
   MCOMessageFlagAnswered      = 1 << 1,
    /** Flagged/Starred flag.*/
    MCOMessageFlagFlagged       = 1 << 2,
    /** Deleted flag.*/
    MCOMessageFlagDeleted       = 1 << 3,
    /** Draft flag.*/
    MCOMessageFlagDraft         = 1 << 4,
    /** $MDNSent flag.*/
    MCOMessageFlagMDNSent       = 1 << 5,
    /** $Forwarded flag.*/
    MCOMessageFlagForwarded     = 1 << 6,
    /** $SubmitPending flag.*/
    MCOMessageFlagSubmitPending = 1 << 7,
    /** $Submitted flag.*/
    MCOMessageFlagSubmitted     = 1 << 8,
} MCOMessageFlag;

typedef 列挙型が実際にどのように機能するのか、特に '= 1 << 8' 型コンポーネントを使用したものがわからないため、メールのフラグ プロパティを読み取る方法について少し迷っています。

たとえば、サーバー上に MCOMessageFlagSeen と MCOMessageFlagFlagged の両方を持つ電子メール メッセージがあります。取得したメールにこれらのフラグのいずれか、または両方があるかどうか (可能であれば)、email.flags プロパティから確認したいと思います。ただし、上記の両方のフラグを持つ電子メールの「email.flags」をデバッガーで出力すると、5 という数字だけが返されます。それが上記の typedef 列挙型定義にどのように関連するのかわかりません。

最終的には、フラグが存在するかどうかに基づいて BOOL 値を設定したいと考えています。言い換えれば、私は次のようなことをしたいと思います:

BOOL wasSeen = email.flags == MCOMessageFlagSeen;
BOOL isFlagged = email.flags == MCOMessageFlagFlagged;

もちろんこれはうまくいきませんが、これがアイデアです。これを達成する方法やtypedef列挙型を理解する方法を誰かが提案できますか?

4

2 に答える 2

3

これらのフラグは、ビットマスクのように使用されます。

unsigned charこれにより、複数のオン/オフ フラグを 1 つの数値型 (または とする)に格納できますunsigned int。基本的に、フラグが設定されている場合、対応するビットも設定されます。

例えば:

MCOMessageFlagMDNSent       = 1 << 5

1<<5は、1 が 5 ビット左にシフトされたことを意味するため、バイナリでは次のようになります。

00000001 << 5 = 00100000

これは、フラグが他のフラグとオーバーラップしない場合にのみ機能します。これは、通常、1 から始めて、フラグごとに異なる量だけ左にシフトすることによって実現されます。

次に、フラグが設定されているかどうかを確認するには、対応するビットが設定されているかどうかを確認します。

if (flags & MCOMessageFlagMDNSent)

結果はtrue、ビットごとの AND の結果がゼロ以外の場合になります。これは、対応するビットが設定されている場合にのみ発生する可能性があります。

OR を使用して簡単にフラグを設定できます。

flags |= MCOMessageFlagMDNSent;

または AND でリセットします。

flags &= ~MCOMessageFlagMDNSent;
于 2013-10-25T16:41:05.173 に答える