我想以这样的方式制作一个枚举,我可以&参与后的参数。
我可以这样做:
enum Things
{
Something,
SomethingElse
};
或者我必须小心为他们提供具体的数字吗?
此外,如果一个值(例如3)已经被| ='d in,那么| =它会再次导致它出现故障(如果,(属性& 3)将不再起作用)
由于
答案 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
答案 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
};