简体   繁体   English

C ++中的按位设置

[英]Bitwise setting in 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
        };

What is the value of AccessSourceAll ?? AccessSourceAll的价值是什么? is it -1? 是-1吗? or is it maximum value? 或者它是最大值? I have a parameter ULONG x , whose default value is AccessSourceAll(that means access to all). 我有一个参数ULONG x,其默认值是AccessSourceAll(这意味着访问所有)。 How do i remove the access right of AccessSourceE only? 如何仅删除AccessSourceE的访问权限? How to add the access right of AccessSourceE again? 如何再次添加AccessSourceE的访问权限?

If i have a particular value in x, then how do i know whether AccessSourceE is set or not? 如果我在x中有特定值,那么我如何知道是否设置了AccessSourceE?

The value of AccessSourceAll is (int)0xFFFFFFFF since enum is of type int in C. AccessSourceAll的值是(int)0xFFFFFFFF因为枚举在C中是int类型。

The unset just AccessSourceE use: 未设置的AccessSourceE使用:

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

To add, use 要添加,请使用

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

To test, 去测试,

if (x & AccessSourceE) { ... }

I'm not sure it'll actually matter since it is a mask which will clearly have a bit set for each of the other values. 我不确定它真的很重要,因为它是一个掩码,显然会为每个其他值设置一个位。

If you are assigning it to a ULONG, it will be an unsigned type. 如果要将其分配给ULONG,则它将是无符号类型。 To set/remove values use bitwise logic: 要设置/删除值,请使用按位逻辑:

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

You can use the ^ operator for this. 您可以使用^运算符。 For Example : 例如 :

unsigned long l_unValue = AccessSource::AccessSourceAll; unsigned long l_unValue = AccessSource :: AccessSourceAll;

l_unValue = l_unValue ^ AccessSource::AccessSourceE; l_unValue = l_unValue ^ AccessSource :: AccessSourceE;

The above statement will remove "AccessSourceE" from "AccessSourceAll". 上述语句将从“AccessSourceAll”中删除“AccessSourceE”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM