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