比特旗帜 - 我错过了什么?

时间:2010-08-21 18:05:31

标签: 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 = 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);
}

帮手:

public static bool HasExactly(this DayOfWeek x, DayOfWeek y) { return x == y; }
public static bool HasAny(this DayOfWeek x, DayOfWeek y) { return 0 != (x & y); }
public static bool HasAll(this DayOfWeek x, DayOfWeek y) { return y == (x & y); }

今天的输出(星期六)

now.DayOfWeek: Saturday
True
True
True
True
True
True 

但输出应该是:

now.DayOfWeek: Saturday
False
False
False
True
True
True 

我在这里缺少什么?

5 个答案:

答案 0 :(得分:12)

星期几不是位标志。 http://msdn.microsoft.com/en-us/library/system.datetime.dayofweek.aspx

  

中的常量值   DayOfWeek枚举范围从   DayOfWeek.Sunday to   DayOfWeek.Saturday。如果演员阵容   整数,其值范围为零   (表示DayOfWeek.Sunday)来   六(表示   DayOfWeek.Saturday)。

答案 1 :(得分:7)

我知道这是一篇旧文章,但以防万一 - 做标志枚举的简洁语法是

[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
}

您需要无以指示未选择任何内容。这样的枚举允许您指示多天,例如:

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

希望这有助于某人。

答案 2 :(得分:2)

如果您需要像旗帜一样使用它,您可以创建自己的DayOfWeek枚举:

[Flags]
public enum MyDayOfWeek { Sunday = 1, Monday = 2, Tuesday = 4, ... , Saturday = 64 };

答案 3 :(得分:1)

DayOfWeek有序号。

使用List<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,
}

答案 4 :(得分:0)

DayOfWeek枚举旨在代表一周中的一天,而不是一组天。

使用&时不会出现编译错误,因为枚举是整数,但运算符没有达到预期效果(除非您恰好只在星期一,星期二或星期四安排事件)。

如果你想要一个比特标志,那么就像Ray建议的那样声明一个比特标志类型。

相关问题