探讨一下C#里面的枚举与位或运算符

  今天看《Pro Net 2.0 Windows Forms And Custom Cortrols In C#》时看到枚举一节,发现了在一个枚举里面需要合并多个值,看到了用到了”|”运算符,原来没怎么注意,今天想了一下为什么用”|”呢?
  MSDN里面看到了这样一句话:“用2的幂(即 1248 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠。”
  于是写了一个例子:

        [FlagsAttribute]
        
enum Colors_1
        
{
            Red 
= 1, Green = 2, Blue = 4, Yellow = 8
        }
;
        
//测试
        private void button1_Click(object sender, EventArgs e)
        
{
            Colors_1 color_1 
= Colors_1.Red | Colors_1.Green | Colors_1.Blue 
| Colors_1.Yellow;

            
string strResult = color_1.ToString() + " " + ((int)color_1)
.ToString();
            MessageBox.Show(strResult);
        }

输出结果:


咦!  1 + 2 + 4 + 8 = 15 刚刚等于15,难道这是巧合?
全部显示出来了,安逸!

再写个例子试试:

        [FlagsAttribute]
        
enum Colors_2
        
{
            Red 
= 1, Green = 2, Blue = 3, Yellow = 4
        }
;
        
//测试
        private void button1_Click(object sender, EventArgs e)
        
{
            Colors_2 color_2 
= Colors_2.Red | Colors_2.Green | Colors_2.Blue
 
| Colors_2.Yellow;

            
string strResult = color_2.ToString() + " " + ((int)color_2).ToString();
            MessageBox.Show(strResult);
        }

输出结果:

晕,怎么没把颜色全部显示出来呀?
咦!3 + 4 = 7 刚好显示枚举值为3,4的两种颜色

再写一个例子呢?

        //测试
        private void button1_Click(object sender, EventArgs e)
        
{
            Colors_1 c 
= (Colors_1)Enum.Parse(typeof(Colors_1), "7");
            MessageBox.Show(c.ToString() 
+ " " + ((int)c).ToString());
        }

输出结果:

居然会自动转换成相应的枚举值,厉害!

 再来我加个枚举为7的值:

        [FlagsAttribute]
        
enum Colors_1
        
{
            Red 
= 1, Green = 2, Blue = 4, Yellow = 8, Seven = 7
        }
;
        
//测试
        private void button1_Click(object sender, EventArgs e)
        
{
            Colors_1 c 
= (Colors_1)Enum.Parse(typeof(Colors_1), "7");
            MessageBox.Show(c.ToString() 
+ " " + ((int)c).ToString());
        }

输出结果:

印证了MSDN那句话,只有将枚举值设置为0,2,4,8…..这样的只才会叠加,枚举会自动判断当前值,如果枚举里面有这个值当然就显示这个值了;如果没有就做匹配用加法看看那几个数加起来刚好是这个枚举值,但如果有几个数字加起来都等于这个值怎么办呢?还没遇到呢,目前这是我的理解,希望大牛些指教!
懒惰使人的思维变得迟钝
posted @ 2008-07-12 15:55 Simens 阅读(1259) 评论(12)  编辑 收藏 网摘 所属分类: .net Winform

  回复  引用  查看    
#1楼 2008-07-12 16:25 | 小顺      
计算机一般是二进制的,所以计算机喜欢2^n
  回复  引用  查看    
#2楼 2008-07-12 16:33 | hoodlum1980      
lz,看来你没怎么看过WIN32 API。位操作的基本性质。
  回复  引用    
#3楼 2008-07-12 16:50 | eee [未注册用户]
楼主连计算机基础都没有....... 这跟win32 api没关系
  回复  引用  查看    
#4楼 [楼主]2008-07-12 17:01 | Simens      

确实我是新手
  回复  引用    
#5楼 2008-07-12 18:23 | 斯克迪亚 [未注册用户]
感谢分享这一枚举特性,以前一直都想找一个对应于多项单选组的简单数据存储格式呢,这方法非常简明。以前做RO私服的时候了解过位运算,不过没想到枚举也能支持,以往的文章中都不曾提及过。
  回复  引用  查看    
#6楼 2008-07-12 20:06 | 沉没的青蛙      
做权限就用这个~很好很强大~

  回复  引用  查看    
#7楼 2008-07-12 23:38 | 代码乱了      
其实就是常规的位操作的原理,枚举只不过支持位操作而已
  回复  引用    
#8楼 2008-07-13 22:52 | llj098 [未注册用户]
0001
0010
0011
0100
-----进行与操作
0111=7

  回复  引用  查看    
#9楼 2008-07-14 09:55 | amingo      
你才知道?
  回复  引用  查看    
#10楼 2008-07-14 10:02 | 曲滨*銘龘鶽      
不是 + 是 & 的好不?

  回复  引用  查看    
#11楼 2008-07-14 11:26 | rockshit      
2^n中的任何N个数相加,都不会有重叠的
  回复  引用  查看    
#12楼 2008-07-17 17:34 | 公木子      
0001
0010
0011
0100
-----进行与操作
0111=7

正解,LZ要学习计算机原理啊。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-13 11:19 编辑过
Google站内搜索

相关文章:

相关链接: