2012-03-19 54 views
1

我需要實現某種位狀態映射的,我不知道如何實現這一點 - 也許我有一個傻瓜;)映射32位值不同的狀態爲每一位

好了,所以我有一個可以是最大的狀態碼。例如32位長1001 0011 每個位都屬於一個特殊的狀態碼 - 字符串。

例如:

Bit 1: String Cancel 
Bit 2: String Okay 
Bit 3: String Save 
.... 
Bit 32: String Next 

現在,我必須確定哪些位設置並返回所有的狀態代碼 - 這是設置INT 32位長的狀態字符串。

我喜歡某種字典或sumthin喜歡那裏我可以爲每個位存儲相應的狀態代碼。

然後我喜歡循環通過32位長的狀態碼,並從字典中獲取相應的狀態碼字符串 - 將其存儲在字符串中,並在32位長的狀態碼循環後返回。

有人有這樣的想法嗎?

+1

嘗試使用枚舉想在這個問題http://stackoverflow.com/questions/40211/how-to-compare-flags-in-c – wiero 2012-03-19 11:57:35

+0

@wiero :將其作爲答案發布,因爲這是正確的方式。 – 2012-03-19 11:59:42

+0

@DanielHilgarth - 你真的有一百萬種不同的狀態信息嗎? 32位似乎是它的過度殺傷力。如果你有超過256個不同的狀態信息,至少我對這個主題有看法,你做錯了什麼。甚至可以將2個字節擴展爲256個以上的消息。 – 2012-03-19 12:10:11

回答

3

你可以使用帶有flags屬性的枚舉。枚舉可以從int轉換而來。 每個枚舉值可以設置讓你的狀態可以是這樣的

[Flags] 
enum Status { None = 0 , Cancel = 1 , Ok = 2 , Save = 4 ... } 

標誌屬性

表示枚舉可以作爲一個位域進行處理;也就是 的一組標誌。

你可以測試

if ((status & Status.Ok) == Status.Ok) 
{ 
// Do something 
} 
+0

請注意'[Flags]'不是嚴格要求的,只會從ToString()產生更好的結果。 – 2012-03-19 12:18:23

+0

我也見過'...取消= 1 << 0,好= 1 << 1,保存= 1 << 2 ...'爲那些不喜歡二進制計數的人。 – Jodrell 2012-03-19 12:22:33

+0

所以我將不得不「手動」檢查「if」語句的所有32個案例?如果狀態有多個位設置 – 2012-03-19 12:33:49