我希望能夠在本月的日子裏使用flag枚舉。按月的按位表示
當前我發現了許多月份或星期幾的例子,它們基於枚舉:short和使用十六進制格式來指定項目的值。
不過我相信一個短小的是31天+最後一天的選擇。我認爲int會做,但我一直在努力解決如何實現這一點,並允許按位操作發生。
任何人都可以幫忙嗎?
我希望能夠在本月的日子裏使用flag枚舉。按月的按位表示
當前我發現了許多月份或星期幾的例子,它們基於枚舉:short和使用十六進制格式來指定項目的值。
不過我相信一個短小的是31天+最後一天的選擇。我認爲int會做,但我一直在努力解決如何實現這一點,並允許按位操作發生。
任何人都可以幫忙嗎?
我想我已經在這裏工作了如下:
/// <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
}
你可以用'1 << x'使它更易讀,它只會是1 - 一天中的數字,所以'Day01 = 1 << 0,Day02 = 1 << 1,Day03 = 1 << 2 ... Day29 = 1 << 28,Day30 = 1 << 29,Day31 = 1 << 30' –
你並不需要一個枚舉,你可以使用一個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);
是的,但是我相信,執行按位運算每個比特需要與其他比特隔離。所以第一位可能代表第一天,第二位代表第二位。因此,要查看是否選擇第一天和第二天,二進制文件必須爲00000011.因此,最大獨立天數小於數據結構的實際最大數量。 –
你當然是對的! –
你爲什麼要關心保存幾個字節? –