作业帮 > 综合 > 作业

标志枚举中 按位或运算的理解

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/06/03 13:32:02
标志枚举中 按位或运算的理解
我定义了标志枚举如下
[Flags]
enum Weeks
{
Sunday=1,
Monday=2,
Tuesday=4,
Wensday=8,
Thursday=16,
Friday=32,
Saturday=64
}
然后测试代码中是
Console.WriteLine("星期二和星期四 为开会日");
Weeks meetingDays = Weeks.Tuesday | Weeks.Thursday; //按位‘或’运算
Console.WriteLine(meetingDays+"\n");
输出结果是 Tuscany,Thursday
按位‘或’运算(同一个位上相同则为0不同则为1)得到的不是一个结果么?
比如 “1|2”结果是“3”,
但是在上面的结果中为什么会输出两个结果 “周二和周四”呢?
你的按位或的结果确实只有一个,但是却有两个位被置位了啊.
这个toString是调用默认的toString,所以会使用G格式来显示.
因为你设置了[Flags]标志,所以会根据多个位把结果组合起来显示,返回用分隔符分隔的这些常数名称的列表
MSDN里面对于G格式的描述:
再问: 能不能解释的稍微通俗一点,我是刚学习没多久,上面的解释看不大懂。
再答: 简单的说,对于枚举的tostring来说,是否有给枚举类型设置flag标志会采取不同的处理办法。 如果没有定义为flags,那么就是真的只有一个值,在你的例子中,4 与16进行按位或之后的值为20,如果你把你的枚举的flag标志去掉,那么tostring结果就是20,因为这个时候20这个数在你的枚举里面找不到对应的,所以就直接显示20了 但是你的枚举定义了flag属性,所以给定的meetingDays的每一位都代表了一个值,所以meetingDays是可以具备多个值得,tostring会依次检查每一位,把所有置1的位代表的字符串以,分割返回回来,而20正好是代表Tuesday和Thursday的位置1了,所以toString的结果就是,分割的Tuesday和Thursday,那么就是Tuesday,Thursday了