2013-08-02 22 views
3

因此,舉例來說,具有Notification以下標誌:代替布爾值的使用INT標誌

public static final int FLAG_AUTO_CANCEL = 0x00000010; 

這是十六進制數16,還有其他標誌與值:

0x00000020 
0x00000040 
0x00000080 

將其轉換爲2的冪。將其轉換爲二進制,我們得到:

00010000 
00100000 
01000000 
10000000 

因此,我們可以使用按位運算符來確定哪些標誌存在等,因爲每個標誌只包含一個1,而且它們都位於不同的位置。

問題

這一切都非常有意義,但爲什麼不使用booleans?這僅僅是文體,還是存在記憶或效率的好處?

編輯:
據我所知,通過組合它們,我們可以有很多的信息存儲在一個單一的int。這是使用完全所以我們可以通過一個int大量的布爾型類型值而不必傳遞大量參數?我不是故意輕視這一點,它非常方便,但還有其他好處嗎?

回答

2

你在說什麼叫做Bit Field。一個優點是所有的信息都可以包含在一個變量中(沒有像ArrayList那樣的開銷)。這對於保持函數簽名整潔很有用,並且由於較少的堆棧操作會帶來一些效率較小的效益,但可能會因附加的bitshift操作而抵消。此外,您可以使用(例如)一個字節來存儲8個字段,而不是浪費7個附加字節。你也可以,如果你很聰明,在一次操作中執行幾次標誌檢查。

話雖如此,個人喜好可能會看到布爾人清單更清潔或更可取。位域在空間有限或性質有限的嵌入式系統中最常見。

關於你編輯:它的存儲值整型標誌的,但這些都只是參考constants--你是不是編輯的,你堅持那些位進入(或離開) flags字段,其​​中單個int。我不知道他們爲什麼選擇了這個應用程序的位域。也許有人在編程空間有限的微控制器的時候編寫了特定的類。普遍的共識似乎是,位域不應包含在新代碼中。

+0

它說:「如果在用戶點擊通知時應該取消通知,應該設置標誌字段的位。當然,每個標誌的值都存儲在一個單獨的變量中,但實際上使用標誌值允許將其存儲到一個變量中。 編輯:不知道如果以前的評論被刪除或只是沒有顯示,但也許這個評論不再相關。 – kevinsa5

+0

我已經添加了更多的答案。 – kevinsa5

1

在C語言中,這是一個常見的習慣用法,其中資源約束是一個更大的問題,您通常在Java中看到Java API直接映射底層的着名C API。然而,由於許多原因,這在Java中並不是一個好主意。

從Java 5開始,大部分1位位域的使用都會被EnumSet很好地處理,該域使用位域在內部實現(所以速度非常快),但是類型安全,易於使用閱讀,和Iterable

+0

謝謝,我不熟悉'EnumSet' +1。 –