2


1

C ++でのビット単位の設定
enum AccessSource
        {
            AccessSourceNull = 0x00000001,
            AccessSourceSec = 0x00000002,
            AccessSourceIpo = 0x00000004,
            AccessSourceSSA = 0x00000008,
            AccessSourceUpgrade = 0x00000010,
            AccessSourceDelta = 0x00000020,
            AccessSourcePhoneM = 0x00000040,
            AccessSourceSoft = 0x00000080,
            AccessSourceCR = 0x00000100,
            AccessSourceA = 0x00000200,
            AccessSourceE = 0x00000400,
            AccessSourceAll = 0xFFFFFFFF
        };

AccessSourceAllの価値は何ですか? -1ですか? それとも最大値ですか? パラメータULONG xがあり、そのデフォルト値はAccessSourceAll(すべてへのアクセスを意味します)です。 AccessSourceEのみのアクセス権を削除するにはどうすればよいですか? AccessSourceEのアクセス権を再度追加する方法は?

xに特定の値がある場合、AccessSourceEが設定されているかどうかをどのようにして知ることができますか?

3 Answer


8


enumではCの int`型であるため、AccessSourceAllの値は(int)0xFFFFFFFF`です。

設定されていない `AccessSourceE`は以下を使用します:

x & ~AccessSourceE  // to assign: x &= ~AccessSourceE;

追加するには

x | AccessSourceE  // to assign: x |= AccessSourceE;

テストする、

if (x & AccessSourceE) { ... }


3


他の値のそれぞれにビットが明確に設定されるマスクであるため、実際に問題になるかどうかはわかりません。

ULONGに割り当てる場合は、符号なしの型になります。 値を設定/削除するには、ビットごとのロジックを使用します。

x |= AccessSourceE; /* set SourceE */
x &= ~AccessSourceE; /* unset SourceE */
if(x & AccessSourceE) /* test SourceE */


0


これには^演算子を使用できます。 例えば ​​:

unsigned long l_unValue = AccessSource

AccessSourceAll;

l_unValue = l_unValue ^ AccessSource

AccessSourceE;

上記のステートメントは、「AccessSourceAll」から「AccessSourceE」を削除します。