怎么做| =和& =工作?

时间:2011-06-18 00:11:20

标签: c++ enums operators

我想以这样的方式制作一个枚举,我可以&参与后的参数。

我可以这样做:

enum Things
{
   Something,
SomethingElse
};

或者我必须小心为他们提供具体的数字吗?

此外,如果一个值(例如3)已经被| ='d in,那么| =它会再次导致它出现故障(如果,(属性& 3)将不再起作用)

由于

5 个答案:

答案 0 :(得分:2)

然后将您的枚举定义为:

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)

你必须使用特殊值,即2的幂(1,2,4,8,16,...)。 在进一步研究这个“|和&功能”之前,您应该阅读此内容: http://en.wikipedia.org/wiki/Binary_numeral_system

这也许值得一读:http://en.wikipedia.org/wiki/Flag_(computing

答案 2 :(得分:1)

当您利用计算机的本机二进制编码时,|&的打包标记效果最佳。

所以,使用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

我希望这是有道理的。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

正如纳瓦兹所说,如果你使用十六进制代码,你可以更轻松地使用

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 
};