2013-10-02 99 views
1

我希望能夠在本月的日子裏使用flag枚舉。按月的按位表示

當前我發現了許多月份或星期幾的例子,它們基於枚舉:short和使用十六進制格式來指定項目的值。

不過我相信一個短小的是31天+最後一天的選擇。我認爲int會做,但我一直在努力解決如何實現這一點,並允許按位操作發生。

任何人都可以幫忙嗎?

+0

是的,但是我相信,執行按位運算每個比特需要與其他比特隔離。所以第一位可能代表第一天,第二位代表第二位。因此,要查看是否選擇第一天和第二天,二進制文件必須爲00000011.因此,最大獨立天數小於數據結構的實際最大數量。 –

+0

你當然是對的! –

+0

你爲什麼要關心保存幾個字節? –

回答

2

我想我已經在這裏工作了如下:

/// <summary> 
/// Values for days of the month (1, 2, etc., Last Day) These carry the Flags 
/// attribute so DaysOfTheMonth and be combined with | (or). 
/// </summary> 
[Flags] 
public enum DaysOfTheMonth : uint 
{ 
    Day01 = 0x1, 
    Day02 = 0x2, 
    Day03 = 0x4, 
    Day04 = 0x8, 
    Day05 = 0x10, 
    Day06 = 0x20, 
    Day07 = 0x40, 
    Day08 = 0x80, 
    Day09 = 0x100, 
    Day10 = 0x200, 
    Day11 = 0x400, 
    Day12 = 0x800, 
    Day13 = 0x1000, 
    Day14 = 0x2000, 
    Day15 = 0x4000, 
    Day16 = 0x8000, 
    Day17 = 0x10000, 
    Day18 = 0x20000, 
    Day19 = 0x40000, 
    Day20 = 0x80000, 
    Day21 = 0x100000, 
    Day22 = 0x200000, 
    Day23 = 0x400000, 
    Day24 = 0x800000, 
    Day25 = 0x1000000, 
    Day26 = 0x2000000, 
    Day27 = 0x4000000, 
    Day28 = 0x8000000, 
    Day29 = 0x10000000, 
    Day30 = 0x20000000, 
    Day31 = 0x40000000, 
    DayLast = 0x80000000 
} 
+2

你可以用'1 << x'使它更易讀,它只會是1 - 一天中的數字,所以'Day01 = 1 << 0,Day02 = 1 << 1,Day03 = 1 << 2 ... Day29 = 1 << 28,Day30 = 1 << 29,Day31 = 1 << 30' –

0

你並不需要一個枚舉,你可以使用一個4字節整數存儲的價值和比較反對錶示的天數時作爲整數可能更方便。

在下面的代碼中(使用C#),第31天(最左邊的位),3和1被標記爲選中狀態。我沒有使用可用於特殊標誌的最低位。您可以檢查下面的代碼,看看如果選擇了每天閱讀:

Int32 selected = Convert.ToInt32("10000000000000000000000000001010", 2); 

for (int day = 1; day <= 31; day++) 
{ 
    int dayMask = 1 << day; 
    bool isSelected = (selected & dayMask) != 0; 
} 

要選擇天,你可以使用下面的代碼:

Int32 toSelect = 0; 

// select day 1 
toSelect = toSelect | (1 << 1); 

// select day 3 
toSelect = toSelect | (1 << 3); 

// select day 31 
toSelect = toSelect | (1 << 31);