|= 和 &= 如何工作?

How do |= and &= work?

本文关键字:工作 何工作      更新时间:2023-10-16

我想以这样一种方式生成枚举,即我可以&在.中输入参数后

我能简单地做吗:

enum Things
{
   Something,
SomethingElse
};

或者我必须小心地给他们具体的数字,这样才能工作吗?

同样,如果一个值,比如说3,已经被|='d输入了,那么|=it输入会不会再次导致它发生故障(比如,如果(attributes&3)将不再工作)

感谢

然后将您的枚举定义为:

enum Things
{
   Something = 1       //0000 0001
   SomethingElse = 2;  //0000 0010
   SomethingX = 4;     //0000 0100
   SomethingY = 8;     //0000 1000
   SomethingZ = 16;    //0001 0000
};

其思想是,二进制表示中只有一个比特应该是1,其他比特应该是0,如上面的注释所示。此外,我在注释中只使用了8位,这并不意味着枚举值是一个字节大小。我使用它们只是为了方便。枚举值可以非常大,甚至可以容纳long

您必须使用特殊值,即二次幂(1,2,4,8,16,…)。在进一步研究这个"|和&功能"之前,您可能应该先阅读以下内容:http://en.wikipedia.org/wiki/Binary_numeral_system

这可能也值得一读:http://en.wikipedia.org/wiki/Flag_(计算)

使用|&包装标志在利用计算机的本地二进制编码时效果最佳。

因此,使用2的幂(这里用十进制表示):

enum Things
{
   Something     = 1,
   SomethingElse = 2,
   SomethingMore = 4,
   SomethingHuge = 8
};

这使得每个标志都可以用整数的单个位专门表示,从而允许单独激活和取消激活每个标志。

结果是:

char x = 0;
x |=  Something;     // x in binary looks like 00000001
x |=  SomethingMore; // x in binary looks like 00001001
x &= ~Something;     // x in binary looks like 00001000

我希望这是有道理的。

如果要对Enum使用逐位运算,则值必须是2的幂。这通常被称为位字段。

正如Nawaz所说,如果你使用十六进制代码,你可以让它变得更容易

enum Things
{
   Something =     0x00000001   //0000 0001
   SomethingElse = 0x00000002;  //0000 0010
   SomethingX    = 0x00000004;  //0000 0100
   SomethingY    = 0x00000008;  //0000 1000
   SomethingZ    = 0x00000010;  //0001 0000 // instead of 16
   SomethingZ2   = 0x00000020;  //0010 0000 // instead of 32
   SomethingZ3   = 0x00000040;  //0100 0000 // instead of 64
   SomethingZ4   = 0x00000080;  //1000 0000 // instead of 128
};

或者更好地使用宏:

#define BITMASK(x) (1<<(x))
enum Things
{
   Something =    BITMASK(0)   //0000 0001
   SomethingElse = BITMASK(1) ;  //0000 0010
   SomethingX    = BITMASK(2) ;  //0000 0100
   SomethingY    = BITMASK(3) ;  //0000 1000
   SomethingZ    = BITMASK(4) ;  //0001 0000 
};