C# 位标志-我缺少什么?
一个简单的代码:C# 位标志-我缺少什么?,c#,bit-manipulation,C#,Bit Manipulation,一个简单的代码: protected void Page_Load(object sender, EventArgs e) { DateTime now = DateTime.UtcNow; lit.Text += "<br/>now.DayOfWeek: " + now.DayOfWeek.ToString(); // weekdays (Saturday is not included) DayOfWeek runningDays = DayO
protected void Page_Load(object sender, EventArgs e)
{
DateTime now = DateTime.UtcNow;
lit.Text += "<br/>now.DayOfWeek: " + now.DayOfWeek.ToString();
// weekdays (Saturday is not included)
DayOfWeek runningDays = DayOfWeek.Monday | DayOfWeek.Tuesday | DayOfWeek.Wednesday | DayOfWeek.Thursday | DayOfWeek.Friday;
lit.Text += "<br/>" + runningDays.HasFlag(now.DayOfWeek);
lit.Text += "<br/>" + runningDays.HasAny(now.DayOfWeek);
lit.Text += "<br/>" + ((runningDays & now.DayOfWeek) != 0);
// weekend (Saturday is in a weekend)
runningDays = DayOfWeek.Saturday | DayOfWeek.Sunday;
lit.Text += "<br/>" + runningDays.HasFlag(now.DayOfWeek);
lit.Text += "<br/>" + runningDays.HasAny(now.DayOfWeek);
lit.Text += "<br/>" + ((runningDays & now.DayOfWeek) != 0);
}
今日产量(星期六)
但是输出应该是这样的:
now.DayOfWeek: Saturday
False
False
False
True
True
True
我在这里遗漏了什么?一周中的每一天都不是比特标志 中常量的值 DayOfWeek枚举的范围为 星期日,星期日至 星期六。如果投给 整数,其值范围为零 (表示星期天)到 六(这表示 星期六)
DayOfWeek有序列号 使用
列表
转到定义显示:
// Summary:
// Specifies the day of the week.
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
// Summary:
// Indicates Sunday.
Sunday = 0,
//
// Summary:
// Indicates Monday.
Monday = 1,
//
// Summary:
// Indicates Tuesday.
Tuesday = 2,
//
// Summary:
// Indicates Wednesday.
Wednesday = 3,
//
// Summary:
// Indicates Thursday.
Thursday = 4,
//
// Summary:
// Indicates Friday.
Friday = 5,
//
// Summary:
// Indicates Saturday.
Saturday = 6,
}
如果需要像使用标志一样使用DayOfWeek枚举,可以创建自己的DayOfWeek枚举:
[Flags]
public enum MyDayOfWeek { Sunday = 1, Monday = 2, Tuesday = 4, ... , Saturday = 64 };
DayOfWeek
枚举旨在表示一周中的一天,而不是一组天
使用&
不会导致编译器错误,因为枚举是整数,但运算符不会执行预期的操作(除非碰巧只在周一、周二或周四安排事件)
如果您想要一个位标志,那么就声明一个位标志类型,就像Ray建议的那样。我知道这是一篇老文章,但以防万一-一个简洁的语法来做标志枚举是非常有用的
[Flags]
public enum DaysOfWeek
{
None = 1 << 0,
Monday = 1 << 1,
Tuesday = 1 << 2,
Wednesday = 1 << 3,
Thursday = 1 << 4,
Friday = 1 << 5,
Saturday = 1 << 6,
Sunday = 1 << 7
}
希望无需评论。为了“解码”该值:
public bool IsDayOfWeekSelected(DaysOfWeek which, DaysOfWeek selection)
{
return selection & which == which;
}
这样我们就可以调用:
var isTuesday = IsDayOfWeekSelected(DaysOfWeek.Tuesday, selectedDays); // => true
var isWednesday = IsDayOfWeekSelected(DaysOfWeek.Wednesday, selectedDays); // => false
var isFriday = IsDayOfWeekSelected(DaysOfWeek.Friday, selectedDays); // => true
希望这对某人有所帮助。我知道我很愚蠢:(谢谢你指出这些文档……我一直忘了它们是开发人员角色的重要组成部分……但我确实认为DayOfWeek是一个标志Enum:o(是的,我最后做了:)但我确实错误地认为DayOfWeek是一个标志枚举…谢谢你。呃…那么你不能在本例中最好使用的位置应用位运算符!不。但最好的可能是从过早优化性能的角度来看,而不是从可读性的角度来看。List.Contains等更容易阅读。是的…我的错误是假设DayofWeek是一种位标志类型…它从来没有以任何其他方式出现过我…愚蠢的我:-(我会使用扩展方法,类似于:
public static bool IsDayOfWeekSelected(这一天sofWeek selectedDays,这一天sofWeekWhat){return selection&which==which;}
然后您可以轻松地执行:selectedDayOfWeekSelected.IsDayOfWeekSelected(DaysOfWeek.周二);
;o)这一点很好。你不必把它塞进实用程序类:)我总是将None
默认为0,你也可以使用Sunday=1
var selectedDays = DaysOfWeek.Tuesday | DaysOfWeek.Friday;
public bool IsDayOfWeekSelected(DaysOfWeek which, DaysOfWeek selection)
{
return selection & which == which;
}
var isTuesday = IsDayOfWeekSelected(DaysOfWeek.Tuesday, selectedDays); // => true
var isWednesday = IsDayOfWeekSelected(DaysOfWeek.Wednesday, selectedDays); // => false
var isFriday = IsDayOfWeekSelected(DaysOfWeek.Friday, selectedDays); // => true